perm filename DFTP.MAC[NET,MRC]4 blob
sn#249865 filedate 1976-11-26 generic text, type T, neo UTF8
TITLE DFTP Datacomputer File Transfer Program
; Bugs/Gripes to Bug-DFTP at MIT-AI
; Current DFTP hackers: WRB@CCA(general, TENEX, TOPS-10)
; MRC@MIT-AI(ITS, SU-AI, TOPS-10)
IFNDEF F.TENX,<F.TENX==1> ; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX
IFNDEF F.PCAP,<F.PCAP==0> ; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED
IFNDEF F.SAIL,<F.SAIL==0> ; -1 IF TOPS-10 VERSION FOR SAIL
IFN F.SAIL,<F.TENX==0>
IF1,<
IFL F.TENX,<PRINTX ASSEMBLING ITS VERSION>
IFE F.TENX,<IFE F.SAIL,<PRINTX ASSEMBLING TOPS-10 VERSION>
IFN F.SAIL,<PRINTX ASSEMBLING SAIL VERSION>
>
IFG F.TENX,<PRINTX ASSEMBLING TENEX VERSION>
IFN F.PCAP,<PRINTX PRIVILEGED CAPABILITIES RESTRICTED>
>
; ***DEFINITIONS***
DCHOST==37
DCSOKT==203
DEFALO==12
SIZBLK==200
SIZPAG==1000
LBSIZE==100
SBSIZE==20
; REGISTER DEFINITIONS
R1==1
R2==2
R3==3
R4==4
R5==5
R6==6
R7==7
R10==10
R11==11
R12==12
R13==13
R14==14
R15==15
R16==16
R17==17
; (SCRATCH REGISTERS)
REG1==1
REG2==2
REG3==3
REG4==4
; (COMMONLY USED REGISTERS)
IOREG==R5
BPREG==R6
FLAG==R15
UTIL==R16
STAK==R17
; (TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
TCIO==R2 ; IO(REGISTER)
TCIBP==R3 ; B(YTE)P(OINTER)
TCIACB==R4 ; A(DDRESSOF)C(ONTROL)B(LOCK)
TCITLP==R5 ; T(RACE)L(IST)P(OINTER)
TCITCC==R6 ; T(RACE)C(OMMAND)C(OUNTER)
TCIPBP==R7 ; P(ARALLEL)B(YTE)P(OINTER)
TCIPCC==R10 ; P(ARALLEL)C(HARACTER)C(OUNTER)
TCISBP==R11 ; S(ERIAL)B(YTE)P(OINTER)
TCISCC==R12 ; S(ERIAL)C(HARACTER)C(OUNTER)
TCIMAC==R13 ; MA(TCHES--)C(OMMANDS)
TCIMAN==R14 ; MA(TCHES--)N(ULLCHARACTER)
; MACRO DEFINITIONS
SALL
IFL F.TENX,<DEFINE RELOC(ADDR)<LOC ADDR>> ; ABS ASSEMBLY ON ITS
DEFINE BEGINR(SAVLST,%RETN)
< ..SAVL==0
..SAVC==0
IFIDN <SAVLST><ALL>,<..SAVL==77777>
IFDIF <SAVLST><ALL>,<
IRP SAVLST,<
IFG <SAVLST>-20,<!!
PRINTX SAVLST NOT A REGISTER>
IFLE <SAVLST>-20,<
IFN ..SAVL&1←SAVLST,<!!
PRINTX SAVLST SAVED TWICE>
..SAVL==..SAVL!1←SAVLST
..SAVC==..SAVC+1>>>
IFN ..SAVL,<
..REG==17
REPEAT 20,<
IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
..REG==..REG-1>>
DEFINE .%RETN <%RETN> ; UNIQUE LOCATION FOR RETURN AND ENDR
DEFINE .%RETL <%RETN':!>
..SFLG==0 ; LARGEST SKIP RETURN
>
; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
; JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
; ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>
; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>
; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE ENDR(SK,N)
< IFB <SK>,<..N==0>
IFIDN <SK><SKIP>,<..N==N
IFG <..N-..SFLG>,<..SFLG==..N>>
IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
REPEAT ..SFLG,<
AOS -..SAVC(STAK)>>
.%RETL
..REG==0
REPEAT 20,<
IFN ..SAVL&1←..REG,<POP STAK,..REG
..SAVL==..SAVL-1←..REG>
..REG==..REG+1>
POPJ STAK,>
DEFINE CALLR(ROUTIN)
< PUSHJ STAK,ROUTIN>
DEFINE TAIN(MSG)
< HRRZI REG1,MSG
CALLR $TAIN$>
DEFINE TCIN(CLIST,RSTR)
< MOVE TCIO,[RSTR,,CLIST]
CALLR $TCIN$>
DEFINE TCIL(ARG)
< ..CMCH==0
..CMWD==0
..CNUM==0
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..CNUM==..CNUM+1
..IDX==0
IRPC ARG<..IDX==..IDX+1>
IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
..FLAG==<-..FLAG>>
IFL ..FLAG,<!!
PRINTX BAD ARGUMENTS TO TCIN>
..CMWD==<<<..CMCH-1>/5>+1>
..LOC1==.
..LOC2==..LOC1+4
..LOC3==..LOC2+..CNUM
RELOC ..LOC3
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..IDX==0
IRPC ARG<..IDX==..IDX+1>
..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
ASCII /ARG/
IFG ..IDX,<REPEAT ..IDX, <0>>
..LOC3==.>
IFL ..FLAG,<
RELOC ..LOC2
ARG
..LOC2==.
RELOC ..LOC3>
..FLAG==<-..FLAG>>
RELOC ..LOC1
..LOC2
..CNUM
..CMCH
..CMWD
RELOC ..LOC3>
DEFINE TSIN(BUFFER,BUFS,MSG,NOECHO)
< MOVE IOREG,[BUFFER,,5*BUFS]
IFB <NOECHO>,< HRRZI UTIL,MSG>
IFNB <NOECHO>,< HRROI UTIL,MSG>
CALLR $TSIN$>
DEFINE TNIN(MSG,RADIX)
< IFB <RADIX>,< MOVE IOREG,[MSG,,↑D10]>
IFNB <RADIX>,< MOVE IOREG,[MSG,,RADIX]>
CALLR $TNIN$>
DEFINE TNOUT(REG,RADIX)
< IFN <REG1-REG>,< MOVE REG1,REG>
IFB <RADIX>,< HRRZI REG2,↑D10>
IFNB <RADIX>,< HRRZI REG2,RADIX>
CALLR $NOUT$>
DEFINE DCNOUT(REG,RADIX)
< IFN <REG1-REG>,< MOVE REG1,REG>
IFB <RADIX>,< HRROI REG2,↑D10>
IFNB <RADIX>,< HRROI REG2,RADIX>
CALLR $NOUT$>
DEFINE PATH(STRING,FLAGS)
< IFB <FLAGS>,< HRRZI FLAG,STRING>
IFNB <FLAGS>,<
HRRI FLAG,STRING
HRLI FLAG,FLAGS>
CALLR $PATH$>
DEFINE SCOPY(SOURCE,DESTIN)
< ILDB 0,SOURCE
JUMPE 0,.+3
IDPB 0,DESTIN
JRST .-3
MOVE SOURCE,DESTIN
IDPB 0,SOURCE>
; SYSTEM DEPENDENT DEFINITIONS
; ((ITS))
IFL F.TENX,<
SEARCH SITS
LOC 150
OPDEF THUD [.LOSE 1000]
; Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO. First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).
INIT: MOVSI (JUMPA)
HRR .JBSA##
.BREAK 12,[400001,,] ;set start address
SETZ 1,
MOVE [1,,2]
BLT 150
.BREAK 16,100000 ;return to DDT
JRST DFTP
; I/O Channels
TTI==1 ; TTY I/O
TTO==2
DCI==3 ; Datalanguage I/O
DCO==4
ICP==5 ; ICP channel
DDI==6 ; Data I/O
DDO==7
LCI==10 ; Local input
LCO==11 ; Local output
; ITS network definitions
%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11
DEFINE TBIN(REG)
< .IOT TTI,REG
CAIN REG,15
MOVEI REG,12
CAIG REG,"z"
CAIGE REG,"a"
CAIA
TRZ REG," ">
TBOUT==<.IOT TTO,>
DEFINE TSOUT(STRING)
< IRP STRING
< PUSH STAK,R1
MOVEI R1,STRING
PUSHJ STAK,$STRIN
POP STAK,R1
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$STRIN: PUSH STAK, ; save AC 0
HRLI R1,(POINT 7,) ; build a byte pointer to string
$STRI1: ILDB R1 ; get a character from string
JUMPE $STRI2 ; quit when done
.IOT TTO, ; output the character
JRST $STRI1 ; and loop for more
$STRI2: POP STAK, ; restore AC 0
POPJ STAK, ; and return
DEFINE DCBIN(REG)
< .IOT DCI,REG
SKIPE FLAGDD
.IOT TTO,REG
>
DCBOUT==<.IOT DCO,>
DEFINE DCSOUT(STRING)
< IRP STRING
< PUSH STAK,R1
MOVEI R1,STRING
PUSHJ STAK,$DSTRI
POP STAK,R1
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$DSTRI: PUSH STAK, ; save AC 0
HRLI R1,(POINT 7,) ; build a byte pointer to string
$DSTR1: ILDB R1 ; get a character from string
JUMPE $DSTR2 ; quit when done
.IOT DCO, ; output the character
SKIPE FLAGDD ; show DATALANGUAGE?
.IOT TTO,
JRST $DSTR1 ; and loop for more
$DSTR2: POP STAK, ; restore AC 0
POPJ STAK, ; and return
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
TWOSEG
RELOC 400000
OPDEF THUD [JSP FLAG,OOPS]
IFN F.SAIL,<IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>>
DCCHAN==1
DDCHAN==2
LFCHAN==3
LDCHAN==4
; DEFINITIONS FROM "IMP.MAC"
.IBDEV==0
.IBSTT==1
.IBERR==1
.IBLCL==2
.IBHST==3
.IBRMT==4
.IUSTT==0
.IUCON==3
.IUCLS==4
.IULSN==5
.IULHS==15
.IESOF==5
.IESKT==11
.IEDWN==13
.IETIM==15
DEFINE TBIN(REG)
< TTCALL 0,REG
CAIE REG,175
CAIN REG,176
MOVEI REG,33
CAILE REG,"Z"+40
JRST .+3
CAIL REG,"A"+40
SUBI REG,40>
DEFINE TBOUT(REG)
< TTCALL 1,REG>
DEFINE TSOUT(STRING)
< IRP STRING
< TTCALL 3,STRING>>
DEFINE DCBIN(REG)
< SKIPG DCIBUF+2
CALLR NUTMI
SOS DCIBUF+2
ILDB REG,DCIBUF+1
JUMPE REG,.-4>
DEFINE DCBOUT(REG)
< IDPB REG,DCOBUF+1
OUT DCCHAN,
JRST .+2
JRST NETEOT>
DEFINE DCSOUT(STRING)
< IRP STRING
< HRRZI REG1,STRING
CALLR NUTMO>
OUT DCCHAN,
JRST .+2
JRST NETEOT>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
SEARCH STENEX
THUD==-1
DEFINE TBIN(REG)
< PBIN
CAILE REG1,"Z"+40
JRST .+3
CAIL REG1,"A"+40
SUBI REG1,40
IFN <REG1-REG>,< HRRZI REG,(REG1)>>
DEFINE TBOUT(REG)
< IFN <REG1-REG>,< HRRZI REG1,(REG)>
PBOUT>
DEFINE TSOUT(STRING)
< IRP STRING
< HRROI REG1,STRING
PSOUT>>
DEFINE DCBIN(REG)
< MOVE REG1,DCIJFN
BIN
SKIPN FLAGDD
JRST .+3
HRRZI REG1,(REG2)
PBOUT
HRRZI REG,(REG2)>
DEFINE DCBOUT(REG)
< MOVE REG1,DCOJFN
HRRZI REG2,(REG)
BOUT
MOVEI REG2,21
MTOPR>
DEFINE DCSOUT(STRING)
< ..IDX==1
IRP STRING<..IDX==..IDX+2>
SKIPN FLAGDD
JRST .+..IDX
IRP STRING
< HRROI REG1,STRING
PSOUT>
MOVE REG1,DCOJFN
SETZ REG3,
IRP STRING
< HRROI REG2,STRING
SOUT>
MOVEI REG2,21
MTOPR>
>
; (((↑↑↑)))
; "<FILE"> FILE LIST(0,55,500),CAT,B=36
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),C=1
; EXTENSION STRING(0,3,79),C=1
; STATUS STRING(1),F=' '
; CREATIONDATE STRING(1,18,79),F='?',C=1
; SAVEDATE STRING(1,18,79),F='?',C=1
; VERSION INTEGER
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; INDEX BYTE,V=I
; COUNT BYTE
; DATA STRING(0,497,1000000),B=36,C=COUNT
; CHECKSUM BYTE
; END;
;
; "<GET"> PORT LIST(0,500),B=36,P=EOF,CHECK
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(79),F=' ',D=0
; EXTENSION STRING(79),F=' ',D=0
; CREATIONDATE STRING(19),F=' ',D=0
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; COUNT BYTE
; DATA STRING(0,437,1000000),B=36,D=0
; CHECKSUM BYTE
; END;
;
; "<PUT"> PORT LIST(0,500),B=36,P=EOF,CHECK
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D=0
; EXTENSION STRING(0,3,79),D=0
; CREATIONDATE STRING(0,18,79),D=0
; SAVEDATE STRING(0,18,79),D=0
; VERSION INTEGER
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; COUNT BYTE
; DATA STRING(0,497,1000000),B=36,C=COUNT
; CHECKSUM BYTE
; END;
;
; "<TERSE"> PORT LIST(0,500),P=EOF
; FILE STRUCTURE,P=EOR
; PREFIX STRING(5),F=' '
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D='.'
; EXTENSION STRING(0,3,79),D=';'
; VERSION INTEGER(1,10),D=' '
; LENGTH INTEGER(1,10),D='('
; BYTESIZE INTEGER(1,10),D=')'
; END
; END;
;
; "<VERBOSE"> PORT LIST(0,500),P=EOF
; FILE STRUCTURE,P=EOR
; PREFIX STRING(5),F=' '
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D='.'
; EXTENSION STRING(0,3,79),D=';'
; VERSION INTEGER(1,10),D=' '
; STATUS STRING(1),D=' '
; CREATIONDATE STRING(1,18,79),D=' '
; SAVEDATE STRING(1,18,79),D=' '
; LENGTH INTEGER(1,10),D='('
; BYTESIZE INTEGER(1,10),D=')'
; END
; END;
; ***PROGRAM***
DFTP:
IFL F.TENX,<.SUSET [.RSNAME,,LCLSNM]>
IFE F.TENX,<JFCL>
IFGE F.TENX,<RESET>
MOVE STAK,[IOWD STSIZ,STBEG]
CALLR S$INIT
CALLR D$INIT
; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
IFL F.TENX,< ; HACK FOR ITS VERSION FOR AUTOENABLE
MOVEI UTIL,CMDM3
.OPEN ['DSK'
SIXBIT/←DFTP←/
SIXBIT/ENABLE/]
>
MOVEI UTIL,CMDM2 ; CAN ENABLE LATER ON
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
; (((ITS)))
IFL F.TENX,<
MOVEI UTIL,CMDM2
.SUSET [.RXUNAME,,REG1]
.CALL [ SETZ
SIXBIT/OPEN/
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ REG1]
MOVEI UTIL,CMDM1 ; NO ITS DIRECTORY
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
MOVEI UTIL,CMDM1
; (!ENABLE!)
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
MOVEI UTIL,CMDM1
MOVEI REG1,400000 ; FOR THIS FORK
RPCAP
TRNE REG2,600000 ; (1B18+1B19) WHEEL OR OPER
MOVEI UTIL,CMDM2
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<.CLOSE>
MOVEM UTIL,CMDMOD
JRST CMDCMD
CMDNEW: TSOUT <CRLF>
CMDCMD: JRST @CMDMOD
CMDM1: TSOUT <[ASCIZ/*/]>
TCIN (CMDMC1,[ASCIZ/*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM2: TSOUT <[ASCIZ/*/]>
TCIN (CMDMC2,[ASCIZ/*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM3: TSOUT <[ASCIZ/!/]>
TCIN (CMDMC3,[ASCIZ/!/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
CALO: PATH ([ASCIZ/ ALLOCATE /],PATHNR!PATHca)
JRST CMDCMD
TSOUT <[ASCIZ/ [Megabits:/]>
TNIN ([ASCIZ/ [Megabits:/])
JRST CMDCMD
MOVEM IOREG,ABUF
JUMPN IOREG,CALO0
MOVEI IOREG,"0"
TBOUT <IOREG>
CALO0: TSOUT <[ASCIZ/]/],CRLF>
CALLR DALO
JRST CMDCMD
CATT: PATH ([ASCIZ/ ATTACH /],PATHNR!PATHCT)
JRST CMDCMD
CALLR DATT
JRST CMDCMD
CCHA: PATH ([ASCIZ/ CHANGE /],PATHNR!PATHca!pathad)
JRST CMDCMD
CALLR DCHA
JRST CMDCMD
CCON: PATH ([ASCIZ/ CONNECT /],PATHNR!PATHCA!pathad)
JRST CMDCMD
CALLR DCON
JRST CMDCMD
CCRE: PATH ([ASCIZ/ CREATE /],PATHNR!PATHca)
JRST CMDCMD
CALLR DCRE
JRST CMDCMD
CDEL: PATH ([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
JRST CMDCMD
CALLR DDEL
JRST CMDCMD
CDIR: PATH ([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
JRST CMDCMD
MOVE IOREG,CMDMOD
CAIN IOREG,CMDM3
JRST CDIR1
TSOUT <[ASCIZ/**/]>
TCIN (CDIRC,[ASCIZ/**/])
JRST CMDCMD
JRST CDIR2
JRST CDIR3
CDIR1: TSOUT <[ASCIZ/!!/]>
TCIN (CDIRC,[ASCIZ/!!/])
JRST CMDCMD
JRST CDIR2
JRST CDIR3
CDIR2: MOVEI FLAG,DD$T
TSOUT <[ASCIZ/TERSE/]>
CDIR3: TSOUT <CRLF>
CALLR DDIR
JRST CMDCMD
CDIRC: TCIL <TERSE,DD$T,VERBOSE,DD$V>
CDIS: TSOUT <CRLF>
MOVEI UTIL,CMDM2
MOVEM UTIL,CMDMOD
JRST CMDCMD
CENA: TSOUT <CRLF>
MOVEI UTIL,CMDM3
MOVEM UTIL,CMDMOD
JRST CMDCMD
; (((TENEX)))
IFG F.TENX,<
CEXE: HRROI REG1,CRLF
PSOUT
HRRZI REG1,-1
RFMOD
MOVE R10,REG2
RFCOC
MOVE R11,REG2
MOVE R12,REG3
HRLZI REG1,(1B1) ; INFERIOR GETS THIS FORK'S CAPABILITIES
CFORK ; CREATE FORK
THUD
MOVE UTIL,REG1
HRLZI REG1,(1B2+1B17)
HRROI REG2,[ASCIZ/<SYSTEM>EXEC.SAV/]
GTJFN
THUD
HRLI REG1,(UTIL)
GET ; LOAD EXEC INTO FORK
MOVE REG1,UTIL
SETZ REG2,
SFRKV ; START FORK AT MAIN STARTUP
WFORK
KFORK
HRRZI REG1,-1
MOVE REG2,R10
SFMOD
MOVE REG2,R11
MOVE REG3,R12
SFCOC
JRST CMDCMD
>
; (((↑↑↑)))
CEXP: PATH ([ASCIZ/ EXPUNGE /],PATHnr!pathcc!pathad!PATHAC)
JRST CMDCMD
CALLR DEXP
JRST CMDCMD
CGET: PATH ([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CLIN: TSOUT <CRLF>
CALLR DLIN
JRST CMDCMD
CLIS: PATH ([ASCIZ/ LIST /],PATHnr!pathcc!PATHAS)
JRST CMDCMD
MOVE IOREG,CMDMOD
CAIN IOREG,CMDM3
JRST CLIS1
TSOUT <[ASCIZ/**/]>
TCIN (CLISC1,[ASCIZ/**/])
JRST CMDCMD
JRST CLIS2
JRST CLIS3
CLIS1: TSOUT <[ASCIZ/!!/]>
TCIN (CLISC2,[ASCIZ/!!/])
JRST CMDCMD
JRST CLIS2
JRST CLIS3
CLIS2: MOVEI FLAG,DL$T
TSOUT <[ASCIZ/TERSE/]>
CLIS3: TSOUT <CRLF>
CALLR DLIS
JRST CMDCMD
CLISC1: TCIL <TERSE,DL$T,VERBOSE,DL$V>
CLISC2: TCIL <PROTECTION,DL$P,TERSE,DL$T,VERBOSE,DL$V>
; (((TOPS-10)))
IFE F.TENX,<
CLOD: TTCALL 3,CRLF
SETZM LUTDSP
CLOD1: CALLR LUTDS
JRST CMDCMD
TTCALL 1,[" "]
TTCALL 3,LUTDSF
TTCALL 3,CRLF
JRST CLOD1
>
; (((↑↑↑)))
CNOD: SETZM FLAGDD
JRST CMDNEW
CPUT: PATH ([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CQUI: TAIN <[ASCIZ/ [Confirm]/]>
JRST CMDCMD
JRST CMDCMD
JRST QUIT
CREM: PATH ([ASCIZ/ REMOVE /],PATHnr!pathcc!PATHAS!PATHAC)
JRST CMDCMD
CALLR DREM
JRST CMDCMD
CRET: PATH ([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CSOD: SETOM FLAGDD
JRST CMDNEW
CSTO: PATH ([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CTTR: SETOM FLAGTT
JRST CMDNEW
CUND: PATH ([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
JRST CMDCMD
CALLR DUND
JRST CMDCMD
CUTR: SETZM FLAGTT
JRST CMDNEW
; ***PATH INPUT AND TRANSLATION***
; FLAG DEFINITIONS
PATHNR==400000 ; NODE REQUIRED
PATHNP==200000 ; NODE POSSIBLE
PATHNF==100000 ; NODE FOUND
PATHFR==040000 ; FILE REQUIRED
PATHFF==020000 ; FILE FOUND
PATHCT==004000 ; CONTEXT TOP
PATHCA==002000 ; CONTEXT ATTACH
PATHCC==001000 ; CONTEXT CONNECT
PATHLR==000400 ; LOCAL TO REMOTE
PATHRL==000200 ; REMOTE TO LOCAL
PATHAS==000040 ; ALLOW SETS
pathad==000020 ; allow (non-set) default
PATHAV==000010 ; ALLOW VERSIONS
PATHAC==000004 ; ACKNOWLEDGE [CONFIRM]
; PATH INPUT CONTROL
; IN: TCIO -- LAST CHARACTER INPUT (TCIN)
; FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$: BEGINR <IOREG,UTIL>
; (((TENEX)))
IFG F.TENX,<
TLNE FLAG,PATHLR
TLO FLAG,PATHAV
>
; (((↑↑↑)))
MOVEI IOREG," "
TBOUT <IOREG>
MOVE IOREG,[GBUF1,,5*LBSIZE]
SETZ UTIL,
CALLR P$IN
RETURN
PUSH STAK,IOREG
MOVE IOREG,[GBUF1,,NBUF]
MOVE UTIL,[FBUF,,EBUF]
CALLR P$PP
POP STAK,IOREG
MOVEM UTIL,VBUF
TLNN FLAG,PATHAC
JRST PAT$10
TAIN <[ASCIZ/ [Confirm]/]>
RETURN
RETURN
RETURN SKIP,1
PAT$10: TLNE FLAG,PATHRL!PATHLR
JRST PAT$11
TSOUT <CRLF>
RETURN SKIP,1
PAT$11: PUSH STAK,IOREG
MOVE IOREG,[FBUF,,EBUF]
; (((TENEX)))
IFG F.TENX,<
TLNE FLAG,PATHRL
SETZ UTIL,
>
; (((↑↑↑)))
CALLR P$LF
POP STAK,IOREG
CAIN IOREG,33
JRST PAT$20
CAIN IOREG," "
JRST PAT$20
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$12: TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$12: SKIPE LJFN
JRST .+3
HRROI REG1,CRLF
PSOUT
>
; (((↑↑↑)))
RETURN SKIP,1
PAT$20: TLNE FLAG,PATHLR
JRST PAT$21
TLNE FLAG,PATHRL
JRST PAT$22
JRST PAT$23
PAT$21: TLNE FLAG,PATHNF
JRST PAT$12
; (((TENEX)))
IFG F.TENX,<
TLZ FLAG,PATHAV
>
; (((↑↑↑)))
JRST PAT$23
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$22: TLZ FLAG,PATHNR!PATHNP!PATHAV
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$22: SKIPN LJFN
JRST .+4
HRROI REG1,CRLF
PSOUT
RETURN SKIP,1
TLZ FLAG,PATHNR!PATHNP
>
; (((↑↑↑)))
PAT$23: TSOUT <[ASCIZ/ [As] /]>
MOVE IOREG,[GBUF2,,5*LBSIZE]
MOVE UTIL,[GBUF1,,[ASCIZ/ [As] /]]
CALLR P$IN
RETURN
TLNE FLAG,PATHLR
JRST PAT$24
TLNE FLAG,PATHRL
JRST PAT$25
RETURN
PAT$24: MOVE IOREG,[GBUF2,,NBUF]
MOVE UTIL,[FBUF,,EBUF]
CALLR P$PP
MOVEM UTIL,VBUF
TSOUT <CRLF>
RETURN SKIP,1
PAT$25: MOVE IOREG,[GBUF2,,GBUF1]
MOVE UTIL,[FSBUF,,ESBUF]
CALLR P$PP
MOVE IOREG,[FSBUF,,ESBUF]
CALLR P$LF
; (((TOPS-10+ITS)))
IFLE F.TENX,<
TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
SKIPE LJFN
JRST .+3
HRROI REG1,CRLF
PSOUT
>
; (((↑↑↑)))
ENDR SKIP,1
; PATH INPUT
; IN: IOREG -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
; UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
; FLAG -- (SAME AS $PATH$)
; OUT: IOREG -- LAST CHARACTER INPUT
; UTIL -- COUNT OF CHARACTERS
; FLAGS:
P$I$AE==400000 ; ANCHOR ENCOUNTERED (<)
P$I$DE==200000 ; DESCENDER ENCOUNTERED (>,.)
P$I$SE==100000 ; SET ENCOUNTERED (*)
P$I$TE==040000 ; TRAILING NODE SET ENCOUNTERED (**)
P$I$PW==010000 ; INPUT PASSWORD
P$I$CC==004000 ; <
P$I$CA==002000 ; <<
P$I$CT==001000 ; <<<
P$I$EP==000400 ; EXTENSION BEING PROCESSED
P$I$VP==000200 ; VERSION BEING PROCESSED
;
P$IN: BEGINR <BPREG,R10,R11,R12,R13>
SETZ R10,
MOVE R11,IOREG
MOVE R12,UTIL
HLR BPREG,IOREG
HRLI BPREG,(point 7,)
SETZ UTIL,
P$ICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST P$IREP
CAIN IOREG,"A"-100
JRST P$IDEL
CAIN IOREG,"X"-100
JRST P$IENR
CAIN IOREG,177
JRST P$IENR
CAIN IOREG,15
JRST P$ICHR
CAIN IOREG,12
JRST P$IEND
CAIN IOREG,33
JRST P$IEND
CAIN IOREG,37
JRST P$IEND
CAIGE IOREG," "
JRST P$IBAD
CAIN IOREG,42
JRST P$IBAD
TRNE R10,P$I$TE
JRST P$IBAD
CAIL UTIL,(R11)
JRST P$IBAD
TRNE R10,P$I$PW
JRST P$ICHP
CAIN IOREG," "
JRST P$IEND
CAIN IOREG,"?"
JRST P$IBAD
CAIN IOREG,"*"
JRST P$ISS
TRNE R10,P$I$VP
JRST P$ISVN
CAIN IOREG,";"
JRST P$ISVS
CAIN IOREG,":"
JRST P$IPON
CAIN IOREG,"<"
JRST P$ISA
CAIN IOREG,">"
JRST P$ISD1
CAIN IOREG,"."
JRST P$ISD2
TRNE R10,P$I$SE
JRST P$IBAD
TRZ R10,P$I$AE!P$I$DE
P$ICHE: IDPB IOREG,BPREG
TBOUT <IOREG>
AOJA UTIL,P$ICHR
P$ICHP: CAIN IOREG,">"
JRST P$IPOF
CAIN IOREG,"'"
JRST P$IBAD
IDPB IOREG,BPREG
AOJA UTIL,P$ICHR
P$ISA: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
TRNN R10,P$I$CC
JRST P$ISA1
TRNN R10,P$I$CA
JRST P$ISA2
TRNN R10,P$I$CT
JRST P$ISA3
JRST P$IBAD
P$ISA1: JUMPN UTIL,P$IBAD
TRO R10,P$I$AE!P$I$CC
JRST P$ICHE
P$ISA2: CAIE UTIL,1
JRST P$IBAD
TRO R10,P$I$AE!P$I$CA
JRST P$ICHE
P$ISA3: CAIE UTIL,2
JRST P$IBAD
TRO R10,P$I$AE!P$I$CT
JRST P$ICHE
P$ISD1: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$EP
JRST P$IBAD
TLNN FLAG,PATHFR
JRST .+3
TRNE R10,P$I$SE
JRST P$IBAD
TROE R10,P$I$DE
JRST P$IBAD
TRZ R10,P$I$SE
JRST P$ICHE
P$ISD2: TLNN FLAG,PATHFR
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$DE!P$I$EP
JRST P$IBAD
TRZ R10,P$I$SE
TRO R10,P$I$DE!P$I$EP
JRST P$ICHE
P$ISVS: TLNN FLAG,PATHAV
JRST P$IBAD
TLNN FLAG,PATHFR
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$VP
JRST P$IBAD
TRNN R10,P$I$DE
JRST .+3
TRNN R10,P$I$EP
JRST P$IBAD
TRZ R10,P$I$SE!P$I$EP
TRO R10,P$I$VP!P$I$DE
JRST P$ICHE
P$ISVN: CAIL IOREG,"0"
CAILE IOREG,"9"
JRST P$IBAD
TRNE R10,P$I$SE
JRST P$IBAD
TRZ R10,P$I$DE
JRST P$ICHE
P$ISS: TLNN FLAG,PATHAS
JRST P$IBAD
TRNE R10,P$I$SE
JRST P$IST
TRZN R10,P$I$AE!P$I$DE
JUMPN UTIL,P$IBAD
TRO R10,P$I$SE
JRST P$ICHE
P$IST: TLNE FLAG,PATHFR
JRST P$IBAD
TRNE R10,P$I$EP!P$I$VP
JRST P$IBAD
TRO R10,P$I$TE
JRST P$ICHE
P$IPON: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
TRNE R10,P$I$AE!P$I$DE!P$I$SE
JRST P$IBAD
MOVEI REG1,1(UTIL)
CAIL REG1,(R11)
JRST P$IBAD
IDPB IOREG,BPREG
TBOUT <IOREG>
MOVEI REG1,"P"-100
IDPB REG1,BPREG
ADDI UTIL,2
TRO R10,P$I$PW
JRST P$ICHR
P$IPOF: MOVEI REG1,1(UTIL)
CAIL REG1,(R11)
JRST P$IBAD
MOVEI REG1,"P"-100
IDPB REG1,BPREG
IDPB IOREG,BPREG
TBOUT <IOREG>
ADDI UTIL,2
TRZ R10,P$I$PW
TRO R10,P$I$DE
JRST P$ICHR
P$IBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST P$ICHR
P$IREP: TSOUT <CRLF>
TSOUT <(FLAG)>
JUMPE R12,P$IR04
HLR R13,R12
HRLI R13,(point 7,)
TRZ R10,P$I$PW
P$IR01: ILDB IOREG,R13
JUMPE IOREG,P$IR03
CAIN IOREG,"P"-100
JRST P$IR02
TRNE R10,P$I$PW
JRST P$IR01
TBOUT <IOREG>
JRST P$IR01
P$IR02: TRC R10,P$I$PW
JRST P$IR01
P$IR03: TSOUT <(R12)>
P$IR04: HRRZI IOREG,(BPREG)
HLR R13,R11
CAIGE IOREG,(R13)
JRST P$ICHR
HRLI R13,(point 7,)
TRZ R10,P$I$PW
P$IR05: CAMN R13,BPREG
JRST P$ICHR
ILDB IOREG,R13
CAIN IOREG,"P"-100
JRST P$IR06
TRNE R10,P$I$PW
JRST P$IR05
TBOUT <IOREG>
JRST P$IR05
P$IR06: TRC R10,P$I$PW
JRST P$IR05
P$IDEL: JUMPE UTIL,P$IBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
CAIN IOREG,"P"-100
JRST P$ID01
LDB REG1,BPREG
CAIN REG1,"P"-100
JRST P$ID02
TRNE R10,P$I$PW
SOJA UTIL,P$ICHR
TBOUT <IOREG>
TRZ R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
CAIN IOREG,"."
TRZ R10,P$I$EP
CAIN IOREG,";"
TRZ R10,P$I$VP
CAIE IOREG,"<"
JRST P$ID00
TRZE R10,P$I$CT
JRST P$ID00
TRZE R10,P$I$CA
JRST P$ID00
TRZ R10,P$I$CC
P$ID00: SUBI UTIL,1
JUMPE UTIL,P$ICHR
LDB REG1,BPREG
CAIN REG1,"<"
TRO R10,P$I$AE
CAIN REG1,">"
TRO R10,P$I$DE
CAIN REG1,"."
TRO R10,P$I$DE
CAIN REG1,";"
TRO R10,P$I$DE
CAIN REG1,"*"
TRO R10,P$I$SE
JRST P$ICHR
P$ID01: TRZ R10,P$I$PW
LDB IOREG,BPREG
JRST P$ID03
P$ID02: TROE R10,P$I$PW
SOJA UTIL,P$ICHR
TRZ R10,P$I$DE
P$ID03: SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
TBOUT <IOREG>
SUBI UTIL,2
JRST P$ICHR
P$IENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETO IOREG,
SETZ UTIL,
RETURN
P$IEND: CAIN IOREG,12
JRST P$IENL
CAIN IOREG,37
JRST P$IENL
TLNN FLAG,PATHAS
JRST P$IENV
JUMPE UTIL,P$IENV
LDB R13,BPREG
CAIN R13,">"
JRST P$IENT
TLNN FLAG,PATHFR
JRST P$IENV
TLNE FLAG,PATHAS
JRST P$IENV
TRNE R10,P$I$AE
JRST P$IBAD
JRST P$IENV
P$IENL: TLNN FLAG,PATHFR
JRST P$IENV
TRNE R10,P$I$AE
JRST P$IBAD
P$IENV: TRNN R10,P$I$DE
JRST .+3
TRNN R10,P$I$EP
JRST P$IBAD
; (((TENEX)))
IFG F.TENX,<
TLNN FLAG,PATHFR
JRST P$IE$4
TLNN FLAG,PATHLR!PATHRL
JRST P$IE$4
JUMPN UTIL,P$IE$4
CAIG R12,-1
JRST .+3
TLNE FLAG,PATHLR
JRST P$IBAD ; PUT -- SECOND ARGUMENT
MOVEI REG1,76
PBOUT
TLNE FLAG,PATHLR
HRLZI REG1,160103 ; OLD,MSG,CONFIRM,JFN,SHORT
TLNE FLAG,PATHRL
HRLZI REG1,660043 ; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
MOVE REG2,[100,,101]
GTJFN
JRST P$IENR
MOVEM REG1,LJFN
HRROI REG1,LFILE
MOVE REG2,LJFN
SETZ REG3,
JFNS
MOVEI REG1,100
BKJFN
THUD
PBIN
MOVEI IOREG,(REG1)
CAILE R12,-1 ; GET SECOND ARGUMENT
JRST P$IE$1
TLNN FLAG,PATHLR ; PUT FIRST ARGUMENT
JRST .+5
CAIN IOREG,33
JRST P$IE$1
CAIN IOREG," "
JRST P$IE$1
HLRO REG1,R11
MOVE REG2,LJFN
MOVE REG3,[002200,,000001]
JFNS
LDB REG2,REG1
CAIE REG2,"."
JRST P$IE$1
SETZ REG2,
DPB REG2,REG1
P$IE$1: HRROI REG1,FSBUF
MOVE REG2,LJFN
HRLZI REG3,002000
JFNS
LDB REG1,[350700,,FSBUF]
CAIN REG1,"*"
SETOM FSBUF
HRROI REG1,ESBUF
HRLZI REG3,000200
JFNS
LDB REG1,[350700,,ESBUF]
CAIN REG1,"*"
SETOM ESBUF
CAIN REG1,0
SETZM ESBUF
TLNN REG2,017000
JRST P$IE$2
TLNE REG2,010000
SETOM VSBUF
TLNE REG2,007000
SETZM VSBUF
JRST P$IE$3
P$IE$2: HRROI REG1,UBUF1
HRLZI REG3,000020
JFNS
HRROI REG1,UBUF1
MOVEI REG3,↑D10
NIN
SETZ REG2,
MOVEM REG2,VSBUF
P$IE$3: HRRZ REG1,LJFN
RLJFN
THUD
MOVEI UTIL,-1(R11)
CAIN IOREG,12
SETOM LJFN
CAIN IOREG,37
SETOM LJFN
RETURN SKIP,1
P$IE$4: CAIG R12,-1
JRST .+3
TLNE FLAG,PATHLR
JRST .+3
SETZM LFILE
SETZM LJFN
>
; (((↑↑↑)))
JUMPN UTIL,P$IENN
TLNN FLAG,PATHAS
JRST p$ienc
MOVE R12,[point 7,[ASCIZ/**/]]
TLNN FLAG,PATHFR
JRST P$IENS
HRRI R12,[ASCIZ/*.*/]
TLNE FLAG,PATHAV
HRRI R12,[ASCIZ/*.*;*/]
JRST P$IENS
p$ienc: tlnn flag,pathad
jrst p$ibad
move r12,[point 7,[asciz/<</]]
tlne flag,pathcc
hrri r12,[asciz/</]
jrst p$iens
P$IENN: TLNN FLAG,PATHAS
JRST P$IENZ
TRNE R10,P$I$EP!P$I$VP
JRST P$IENZ
tlnn flag,pathfr
jrst .+3
trnn r10,p$i$ae!p$i$de
jrst p$ienz
CAIN IOREG,12
JRST P$IENZ
CAIN IOREG,37
JRST P$IENZ
LDB R13,BPREG
CAIN R13,"<"
JRST P$IENT
MOVEI R13,">"
IDPB R13,BPREG
TBOUT <R13>
ADDI UTIL,1
P$IENT: MOVE R12,[point 7,[ASCIZ/**/]]
TLNN FLAG,PATHFR
JRST P$IENS
HRRI R12,[ASCIZ/*.*/]
TLNE FLAG,PATHAV
HRRI R12,[ASCIZ/*.*;*/]
P$IENS: ILDB R13,R12
IDPB R13,BPREG
JUMPE R13,RETN(1)
TBOUT <R13>
AOJA UTIL,P$IENS
P$IENZ: SETZ R13,
IDPB R13,BPREG
ENDR SKIP,1
; P$PP -- PROCESS PATH (NODES AND FILES)
; IN: IOREG -- SOURCE,,NODE DESTINATION
; UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
; FLAG -- PATH CONTEXT FLAGS
; OUT: FLAG -- FOUND FLAGS
; UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP: BEGINR <BPREG>
TLNE FLAG,PATHNR
JRST P$PN
HLR BPREG,IOREG
HRLI BPREG,(point 7,)
TLNN FLAG,PATHNP
JRST P$PF0
SETZM (IOREG)
MOVE REG1,BPREG
MOVE REG2,BPREG
P$PS1: ILDB REG3,BPREG
CAIN REG3,"<"
JRST P$PS2
CAIN REG3,">"
JRST P$PS2
CAIN REG3,"."
JRST P$PS3
CAIN REG3,";"
JRST P$PS3
JUMPE REG3,P$PS3
JRST P$PS1
P$PS2: MOVE REG2,BPREG
JRST P$PS1
P$PS3: MOVE BPREG,REG2
CAMN BPREG,REG1
JRST P$PF
TLO FLAG,PATHNF
MOVE REG1,BPREG
LDB REG2,REG1
CAIN REG2,"<"
ILDB REG2,REG1
SETZ REG3,
DPB REG3,REG1
PUSH STAK,REG1
PUSH STAK,REG2
CALLR P$CP
POP STAK,REG2
POP STAK,REG1
DPB REG2,REG1
JRST P$PF
P$PN: TLO FLAG,PATHNF
CALLR P$CP
RETURN
P$PF: SKIPE (IOREG)
JRST P$PF0
MOVE REG1,[point 7,CONTEX]
MOVE REG2,[point 7,NBUF]
SCOPY (REG1,REG2)
P$PF0: TLO FLAG,PATHFF
SETZM (UTIL)
HLR REG1,UTIL
HRLI REG1,(point 7,)
P$PF1: ILDB REG2,BPREG
IDPB REG2,REG1
JUMPE REG2,P$PF3
CAIN REG2,";"
JRST P$PF4
CAIE REG2,"."
JRST P$PF1
SETZ REG2,
DPB REG2,REG1
HRRI REG1,(UTIL)
HRLI REG1,(point 7,)
P$PF2: ILDB REG2,BPREG
IDPB REG2,REG1
CAIN REG2,";"
JRST P$PF4
JUMPN REG2,P$PF2
P$PF3: SETZ UTIL,
RETURN
P$PF4: SETZ REG2,
DPB REG2,REG1
ILDB REG2,BPREG
CAIE REG2,"*"
JRST P$PF5
SETO UTIL,
RETURN
P$PF5: SETZ UTIL,
P$PF6: SUBI REG2,"0"
IMULI UTIL,↑D10
ADDI UTIL,(REG2)
ILDB REG2,BPREG
JUMPN REG2,P$PF6
ENDR
; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
; IN: IOREG -- SOURCE,,DESTINATION
; FLAG -- PATH CONTEXT FLAGS
;
P$CP: BEGINR <IOREG,FLAG>
MOVEI REG1,<<LBSIZE*5>-1>
HLR REG2,IOREG
HRLI REG2,350700
HRRI REG3,(IOREG)
HRLI REG3,(point 7,)
LDB IOREG,REG2
CAIN IOREG,"<"
JRST P$CPCX
TLNE FLAG,PATHCT
JRST P$CPCT
TLNE FLAG,PATHCA
JRST P$CPCA
JRST P$CPCC
P$CPCX: ILDB IOREG,REG2
CAIE IOREG,"<"
JRST P$CPCC
ILDB IOREG,REG2
CAIE IOREG,"<"
JRST P$CPCA
ILDB IOREG,REG2
P$CPCT: MOVE REG4,[point 7,[ASCIZ/%TOP./]]
SCOPY (REG4,REG3)
MOVE REG4,[point 7,ANCHOR]
SCOPY (REG4,REG3)
SUBI REG1,11
JRST P$CPCE
P$CPCA: MOVE REG4,[point 7,[ASCIZ/%LOGIN/]]
SCOPY (REG4,REG3)
SUBI REG1,6
JRST P$CPCE
P$CPCC: MOVE REG4,[point 7,CONTEX]
ILDB 0,REG4
JUMPE 0,.+4
SOJL REG1,P$CPE
IDPB 0,REG3
JRST .-4
MOVE REG4,REG3
IDPB 0,REG4
P$CPCE: JUMPE IOREG,P$CPZ0
MOVEI REG4,"."
IDPB REG4,REG3
SUBI REG1,1
MOVEI REG4,42
SETZ FLAG,
JRST P$CPI0
P$CPI: ILDB IOREG,REG2
P$CPI0: CAIN IOREG,"P"-100
JRST P$CPI
CAIN IOREG,">"
JRST P$CPS
JUMPE IOREG,P$CPZ
JUMPN FLAG,P$CPO
CAIN IOREG,":"
JRST P$CPP
CAIN IOREG,"*"
JRST P$CPO
CAIGE IOREG,"A"
JRST P$CPQ
CAILE IOREG,"Z"
JRST P$CPQ
P$CPO: SOJL REG1,P$CPE
IDPB IOREG,REG3
JRST P$CPI
P$CPQ: SOJL REG1,P$CPE
IDPB REG4,REG3
JRST P$CPO
P$CPS: JUMPE FLAG,.+6
MOVEI IOREG,"'"
IDPB IOREG,REG3
MOVEI IOREG,")"
IDPB IOREG,R3
SETZ FLAG,
MOVEI IOREG,"."
JRST P$CPO
P$CPP: SUBI REG1,4
JUMPL REG1,P$CPE
MOVEI IOREG,"("
IDPB IOREG,R3
MOVEI IOREG,"'"
IDPB IOREG,R3
SETO FLAG,
JRST P$CPI
P$CPE: TSOUT <[ASCIZ/ (Pathname too long.)/],CRLF>
MOVE STAK,[IOWD STSIZ,STBEG]
JRST CMDCMD
P$CPZ: JUMPE FLAG,.+5
MOVEI REG1,"'"
IDPB REG1,REG3
MOVEI REG1,")"
IDPB REG1,REG3
P$CPZ0: IDPB IOREG,REG3
ENDR
; LOCAL FILE NAME PREPARATION
; IN: IOREG -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF: BEGINR <IOREG>
; (((TENEX)))
IFG F.TENX,<
SKIPE LFILE
RETURN
>
; (((↑↑↑)))
HLL REG1,IOREG
HRRI REG1,FSBUF
BLT REG1,<FSBUF+SBSIZE-1>
LDB REG1,[350700,,FSBUF]
CAIN REG1,"*"
SETOM FSBUF
HRLI REG1,(IOREG)
HRRI REG1,ESBUF
BLT REG1,<ESBUF+SBSIZE-1>
LDB REG1,[350700,,ESBUF]
CAIN REG1,"*"
SETOM ESBUF
CAIN REG1,0
SETZM ESBUF
HLR REG1,IOREG
HRLI REG1,(point 7,)
MOVE REG2,[point 7,ABUF]
ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,.-2
SKIPN (IOREG)
JRST .+8
MOVEI REG3,"."
DPB REG3,REG2
HRRI REG1,(IOREG)
HRLI REG1,(point 7,)
ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,.-2
; (((TOPS-10+ITS)))
IFLE F.TENX,<
HRRZI IOREG,ABUF
CALLR LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
MOVEM UTIL,VSBUF
JUMPE UTIL,P$LFX1
MOVEI REG3,";"
DPB REG3,REG2
JUMPG UTIL,P$LFX0
MOVEI REG3,"*"
IDPB REG3,REG2
SETZ REG3,
IDPB REG3,REG2
JRST P$LFX1
P$LFX0: MOVE REG1,REG2
MOVE REG2,UTIL
MOVEI REG3,↑D10
NOUT
THUD
P$LFX1: MOVE IOREG,[ABUF,,LFILE]
BLT IOREG,<LFILE+SBSIZE-1>
>
; (((↑↑↑)))
ENDR
; ***DATACOMPUTER INTERFACE ROUTINES***
; DALO -- ALLOCATE SPACE
;
DALO: BEGINR
DCSOUT <[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
MOVE IOREG,ABUF
DCNOUT <IOREG>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
ENDR
; DATT -- LOGIN TO NODE
;
DATT: BEGINR
DCSOUT <[ASCIZ/LOGIN /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVE REG1,[ASCII/%LOGI/]
MOVEM REG1,CONTEX
MOVE REG1,[ASCII/N/]
MOVEM REG1,<CONTEX+1>
SKIPN OPENED
RETURN
SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
RETURN
ENDR
; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA: BEGINR <IOREG,UTIL>
DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCHAD: DCSOUT <[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST DCHAD
TSOUT <[ASCIZ/ [OK]/],CRLF>
DCHAI: TAIN <[ASCIZ/ Add a new privilege? /]>
RETURN
RETURN
SETZM ABUF ; WRITE FLAG
SETZM <ABUF+1> ; HOST
SETzM <ABUF+2> ; SOCKET
SETOM <ABUF+3> ; PASSWORD
TAIN <[ASCIZ/ Allow control? /]>
JRST DCHAI
SETOM ABUF
TAIN <[ASCIZ/ Restrict via network? /]>
JRST DCHAI
JRST DCHAI5
tain <[asciz/ restrict via local host? /]>
jrst dchai
jrst dchai1
move ioreg,lhost
jrst dchai2
dchai1: tsout <[asciz/ host number (octal): /]>
TNIN ([ASCIZ/ Host number (octal): /],10)
JRST DCHAI
TSOUT <CRLF>
DCHAI2: MOVEM IOREG,<ABUF+1>
TAIN <[ASCIZ/ RESTRICT VIA USER? /]>
JRST DCHAI
JRST DCHAI5
MOVE IOREG,LHOST
CAMN IOREG,<ABUF+1>
JRST DCHAI3
TSOUT <[ASCIZ/ SOCKET NUMBER (OCTAL): /]>
TNIN ([ASCIZ/ SOCKET NUMBER (OCTAL): /],10)
JRST DCHAI
JRST DCHAI4
dchai3:
; (((NOT ITS)))
IFGE F.TENX,<
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)
IFE F.SAIL,<
TSOUT <[ASCIZ/ User: /]>
TNIN ([ASCIZ/ User: /],10)
JRST DCHAI
LSH IOREG,11
ADDI IOREG,100
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
TSOUT <[ASCIZ/ User: /]>
TSIN (UBUF1,LBSIZE,[ASCIZ/ User: /])
JRST DCHAI
SETZ REG1,
MOVE REG2,[point 7,UBUF1]
STDIR
JRST .+3
JRST .+2
JRST .+4
HRROI REG1,[ASCIZ/ (User not found.)
/]
PSOUT
JRST DCHAI
HRRZI IOREG,(REG1)
LSH IOREG,↑D15
ADDI IOREG,20
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<SETZM ABUF+2
JRST DCHAI5>
IFN F.SAIL,<SETZM <ABUF+2>
JRST DCHAI5>
dchai4: MOVEM IOREG,<ABUF+2>
TSOUT <CRLF>
dchai5: TAIN <[ASCIZ/ Restrict via password? /]>
JRST DCHAI
JRST DCHAC
TSOUT <[ASCIZ/ Password: /]>
TSIN (<ABUF+3>,<SBSIZE-3>,[ASCIZ/ Password: /])
JRST DCHAI
TSOUT <CRLF>
DCHAC: DCSOUT <[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
SKIPE ABUF
JRST DCHAC1
DCSOUT <[ASCIZ/CWA/]>
DCHAC1: SKIPN <ABUF+1>
JRST DCHAC3
DCSOUT <<[ASCIZ/,H=/]>>
MOVE IOREG,<ABUF+1>
DCNOUT <IOREG>
DCSOUT <<[ASCIZ/,S=/]>>
MOVE IOREG,<ABUF+2>
JUMPE IOREG,DCHAC2
DCNOUT <IOREG>
JRST DCHAC3
DCHAC2: DCSOUT <[ASCIZ/ANY/]>
DCHAC3: SETO IOREG,
CAMN IOREG,<ABUF+3>
JRST DCHAC4
DCSOUT <<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4: DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
TSOUT <[ASCIZ/ [OK]/],CRLF>
JRST DCHAI
ENDR
; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON: BEGINR
DCSOUT <[ASCIZ/LIST /],NBUF,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST DCON1
TSOUT <[ASCIZ/ [Old Node]/],CRLF>
JRST DCON2
RETURN
DCON1: TAIN <[ASCIZ/ [New Node][Confirm]/]>
RETURN
RETURN
DCSOUT <[ASCIZ/CREATE /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCON2: MOVE REG1,[point 7,NBUF]
MOVE REG2,[point 7,CONTEX]
SCOPY (REG1,REG2)
ENDR
; DCRE -- CREATE NEW NODE
;
DCRE: BEGINR
DCSOUT <[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
MOVEI IOREG,DEFALO
DCNOUT <IOREG>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
CALLR DCHA
ENDR
; DDEL -- DELETE FILES
;
DDEL: BEGINR <IOREG>
SETZ IOREG,
CALLR D$OPEN
RETURN
SETO IOREG,
CALLR D$VER
RETURN
DCSOUT <[ASCIZ/BEGIN
DECLARE DELETED INTEGER
DELETED=0
UPDATE FILES IN "<FILES">/]>
HRRZI IOREG,[ASCIZ/ STATUS EQ ' '/]
CALLR D$WITH
DCSOUT <DDELS>
SETOM FLAGDE
CALLR RENDEM
RETURN
CALLR RENDER
RETURN
ENDR
DDELS: ASCIZ/
BEGIN
STATUS='D'
DELETED=DELETED+1
COMMENT FILES.FILE.HEADER.FILENAME
! '.' ! FILES.FILE.HEADER.EXTENSION
! ';' ! FILES.FILE.HEADER.VERSION
END
IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
END;
/
; DDIR -- FILE DIRECTORY
; IN: FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR: BEGINR <IOREG,UTIL>
; (((TENEX)))
IFG F.TENX,<
SETZM FLAGCO
>
; (((↑↑↑)))
SETO IOREG,
CALLR D$OPEN
RETURN
SKIPN VBUF
SETOM VBUF
SETZ UTIL,
CAIN FLAG,DD$T
JRST DDIRO1
CAIN FLAG,DD$V
JRST DDIRO2
RETURN
DDIRO1: DCSOUT <[ASCIZ/"<TERSE">="<FILES">/]>
HRRZI IOREG,[ASCIZ/ STATUS EQ ' '/]
JRST DDIRO3
DDIRO2: DCSOUT <[ASCIZ/"<VERBOSE">="<FILES">/]>
SETZ IOREG,
DDIRO3: CALLR D$WITH
DCSOUT <SEMI>
MOVE IOREG,[ASCII/.I241/]
CALLR RENFIP
RETURN
CALLR RENLIN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRF: CALLR RENPRE
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRF: SKIPN FLAGCO
JRST DDIRF0
HRROI REG1,[ASCIZ/ [Aborting]
/]
PSOUT
MOVE REG1,DCOJFN
MOVEI REG2,22
MTOPR
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <SEMI>
SETZM FLAGDE
CALLR RENDER
RETURN
RETURN
DDIRF0: CALLR RENPRE
>
; (((↑↑↑)))
CAMN IOREG,[ASCII/ /]
JRST DDIRF1
CAMN IOREG,[ASCII/.I261/]
JRST DDIRF2
CALLR RENLIP
SETZM FLAGDE
CALLR RENDER
RETURN
RETURN
DDIRF1: CALLR <(FLAG)>
AOJA UTIL,DDIRF
DDIRF2: CALLR RENLIN
SETOM FLAGDE
CALLR RENDER
RETURN
JUMPN UTIL,RETN(0)
TSOUT <[ASCIZ/ [No Files]/],CRLF>
ENDR
; DD$T -- TERSE FILES
;
DD$T: BEGINR <IOREG>
SKIPE FLAGDD
JRST DD$T1
MOVEI IOREG,11
TBOUT <IOREG>
DD$T1: DCBIN <IOREG>
SKIPE FLAGDD
JRST DD$T2
TBOUT <IOREG>
DD$T2: CAIE IOREG,12
JRST DD$T1
ENDR
; DD$V -- VERBOSE FILES
;
DD$V: BEGINR <IOREG>
SKIPE FLAGDD
JRST DD$V1
MOVEI IOREG,11
TBOUT <IOREG>
DD$V1: DCBIN <IOREG>
SKIPE FLAGDD
JRST DD$V3
CAIN IOREG,11
JRST DD$V2
TBOUT <IOREG>
JRST DD$V3
DD$V2: TSOUT <CRLF>
TBOUT <IOREG>
TBOUT <IOREG>
JRST DD$V1
DD$V3: CAIE IOREG,12
JRST DD$V1
ENDR
; DEXP -- EXPUNGE
;
DEXP: BEGINR <IOREG>
DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
CALLR RENPRE
CALLR RENLIN
CAmn IOREG,[ASCII/.I280/]
jrst dexp1
tsout <[asciz/ (there are no <FILES>.)/],CRLF>
JRST DEXP3
JRST DEXP3
DEXP1: DCBIN <IOREG>
CAIE IOREG,12
JRST DEXP2
DCBIN <IOREG>
CAIN IOREG," "
JRST DEXP2
CALLR RENLIN
JRST DEXP3
DEXP2: CAIE IOREG," "
JRST DEXP1
DCBIN <IOREG>
CAIE IOREG,"R"
JRST DEXP1
DCBIN <IOREG>
CAIE IOREG,"E"
JRST DEXP1
DCBIN <IOREG>
CAIE IOREG,"C"
JRST DEXP1
DCBIN <IOREG>
CAIE IOREG,"S"
JRST DEXP1
DCBIN <IOREG>
CAIE IOREG,"="
JRST DEXP1
CALLR DCNIN
CALLR RENLIN
SETZM FLAGDE
CALLR RENDER
JRST .+1
JUMPN IOREG,DEXP4
DCSOUT <[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
SKIPN OPENED
RETURN
SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
DEXP3: SETZM FLAGDE
CALLR RENDER
RETURN
RETURN
DEXP4: SETZ IOREG,
CALLR D$OPEN
RETURN
DCSOUT <[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
ENDR
; DGET -- GET-RETRIEVE
;
DGET: BEGINR <IOREG,FLAG>
; (((TENEX)))
IFG F.TENX,<
GJINF
CAME REG2,LDIR
CALLR D$CON
>
; (((↑↑↑)))
SETZ FLAG,
SETO IOREG,
CALLR D$OPEN
RETURN
SKIPLE VBUF
JRST DGET1
MOVEI IOREG," "
CALLR D$VER
RETURN
JRST DGET2
DGET1: DCSOUT <[ASCIZ/BEGIN
DECLARE EXTANT INT
EXTANT=0
FOR "<FILES">
WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
AND (VERSION EQ /]>
MOVE IOREG,VBUF
DCNOUT <IOREG>
DCSOUT <[ASCIZ/)
AND (STATUS EQ ' ')
EXTANT=EXTANT+1
IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
END/],SEMI>
SETOM FLAGDE
CALLR RENDEM
RETURN
CALLR RENDER
RETURN
DGET2: DCSOUT <[ASCIZ/"<GET">="<FILES">/]>
HRRZI IOREG,[ASCIZ/ STATUS EQ ' '/]
CALLR D$WITH
DCSOUT <SEMI>
CALLR NETOI
THUD
MOVE IOREG,[ASCII/;I249/]
CALLR RENFIP
RETURN
CALLR RENLIN
TSOUT <[ASCIZ/ [OK]/],CRLF>
SETZM NSUM
DGET3: CALLR GETFIL
JRST DGET4 ; EXIT RETRIEVAL LOOP ON NETWORK EOF
CALLR LOCNFO
CALLR LOCOO
THUD
CALLR GETDAT
CALLR LOCC
SKIPE FLAGTT
CALLR NETRAT
AOJA FLAG,DGET3
DGET4: CALLR NETC
MOVE IOREG,[ASCII/;I269/]
CALLR RENFIP
RETURN
CALLR RENLIN
CALLR NETSUM
SETOM FLAGDE
CALLR RENDER
RETURN
JUMPN FLAG,RETN(1)
TSOUT <[ASCIZ/ (No Such File)/],CRLF>
ENDR SKIP,1
; FIELD LENGTHS IN WORDS FROM <GET>
GET$F==SBSIZE ; FILENAME
GET$E==SBSIZE ; EXTENSION
GET$D==4 ; DATE
; DLIN -- DATACOMPUTER LINK
;
DLIN: BEGINR <IOREG,UTIL,FLAG>
MOVE FLAG,FLAGDD
DLINI: TSOUT (<[BYTE (7)76,0,0,0,0]>)
TSIN (ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
JRST DLINI
JUMPE UTIL,DLINE
TSOUT <CRLF>
SETZM FLAGDD
DCSOUT <ABUF,CRLF>
SETOM FLAGDD
CALLR RENDER
JRST DLINI
JRST DLINI
DLINE: TSOUT <[ASCIZ/[Returning]/],CRLF>
MOVEM FLAG,FLAGDD
ENDR
; DLIS -- NODE DIRECTORY
; IN: FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS: BEGINR <IOREG,UTIL>
; (((TENEX)))
IFG F.TENX,<
SETZM FLAGCO
>
; (((↑↑↑)))
CAIN FLAG,DL$T
JRST DLISO1
CAIN FLAG,DL$V
JRST DLISO2
CAIN FLAG,DL$P
JRST DLISO3
RETURN
DLISO1: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
JRST DLISI
DLISO2: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
JRST DLISI
DLISO3: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI: SETZ UTIL,
SETZM GBUF1
MOVE REG1,[GBUF1,,GBUF1+1]
BLT REG1,<GBUF1+LBSIZE-1>
MOVEI REG1,<GBUF2+1>
MOVEM REG1,GBUF2
CALLR RENPRE
CAMN IOREG,[ASCII/.I280/]
JRST DLISD
CALLR RENLIP
JRST DLISER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DLISN: DCBIN <IOREG>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DLISN: SKIPN FLAGCO
JRST DLISN0
HRROI REG1,[ASCIZ/ [Aborting]
/]
PSOUT
MOVE REG1,DCOJFN
MOVEI REG2,22
MTOPR
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <SEMI>
JRST DLISER
DLISN0: DCBIN <IOREG>
>
; (((↑↑↑)))
CAIE IOREG," "
JRST DLISE
SETO UTIL,
SKIPE FLAGDD
JRST DLISD
CALLR <(FLAG)>
JRST DLISN
DLISD: CALLR RENLIN
JRST DLISN
DLISE: CAIN IOREG,"?"
JRST DEATH
CALLR RENLIN
JUMPN UTIL,DLISER
TSOUT <[ASCIZ/ [No Nodes]/],CRLF>
DLISER: SETZM FLAGDE
CALLR RENDER
RETURN
ENDR
; DL$T -- TERSE NODES
;
DL$T: BEGINR
CALLR DL$NAM
JRST DL$T0
TSOUT <CRLF>
DL$T0: CALLR RENLIN
ENDR
; DL$V -- VERBOSE NODES
;
DL$V: BEGINR <IOREG,UTIL,FLAG>
DL$VN: DCBIN <IOREG>
CAIE IOREG,"="
JRST DL$VN
CALLR DL$NAM
JRST DL$VE
TSOUT <CRLF>
MOVEI UTIL,GBUF1
SKIPE (UTIL)
AOJA UTIL,.-1
SUBI UTIL,GBUF1
DL$VF: DCBIN <IOREG>
CAIE IOREG,"="
JRST DL$VF
DCBIN <IOREG>
SETZ FLAG,
CAIN IOREG,"F"
MOVEI FLAG,6
CAIN IOREG,"P"
MOVEI FLAG,1
CAIN IOREG,"N"
MOVEI FLAG,3
JUMPE FLAG,DL$VE
CALLR RENLIN
DL$VD: MOVEI IOREG,(UTIL)
DL$VD0: TSOUT <[ASCIZ/ /]>
SOJGE IOREG,DL$VD0
MOVEI IOREG,"]"
TBOUT <IOREG>
DL$VD1: DCBIN <IOREG>
TBOUT <IOREG>
CAIE IOREG,12
JRST DL$VD1
SOJG FLAG,DL$VD
RETURN
DL$VE: CALLR RENLIN
ENDR
; DL$P -- PROTECTION
;
DL$P: BEGINR <IOREG>
CALLR DL$NAM
JRST DL$P1
TSOUT <CRLF>
CALLR RENLIN
RETURN
DL$P1: MOVEI IOREG,GBUF1
DL$P2: SKIPE (IOREG)
AOJA IOREG,DL$P2
SUBI IOREG,GBUF1
DL$P3: TSOUT <[ASCIZ/ /]>
SOJGE IOREG,DL$P3
MOVEI IOREG,"]"
TBOUT <IOREG>
DL$P4: DCBIN <IOREG>
TBOUT <IOREG>
CAIE IOREG,12
JRST DL$P4
ENDR
; DL$NAM -- DIRECTORY: NAME OUTPUT
; OUT: IOREG -- LAST CHARACTER INPUT
;
DL$NAM: BEGINR <BPREG,UTIL,FLAG,R10>
SETZ R10,
SETZ FLAG,
MOVE BPREG,[point 7,ABUF]
MOVEI UTIL,<SBSIZE*5>
DCBIN <IOREG>
CAILE IOREG," "
JRST DL$NA1
RETURN
DL$NAN: DCBIN <IOREG>
DL$NA1: CAIN IOREG,"."
JRST DL$NIN
CAIG IOREG," "
JRST DL$NA3
CAIE IOREG,42
JRST DL$NA2
DCBIN <IOREG>
DL$NA2: IDPB IOREG,BPREG
SOJG UTIL,DL$NAN
JRST DL$NER
DL$NA3: SETZ REG1,
IDPB REG1,BPREG
TSOUT <[ASCIZ/ /],ABUF>
RETURN SKIP,1
DL$NIN: MOVE BPREG,[point 7,ABUF]
MOVEI UTIL,<SBSIZE*5>
DL$NI1: DCBIN <IOREG>
CAIN IOREG,"."
JRST DL$NCN
CAIG IOREG," "
JRST DL$NCN
DL$NI2: CAIE IOREG,42
JRST DL$NI3
DCBIN <IOREG>
DL$NI3: IDPB IOREG,BPREG
SOJG UTIL,DL$NI1
JRST DL$NER
DL$NCN: SETZ REG1,
IDPB REG1,BPREG
SKIPN REG2,GBUF1(FLAG)
JRST DL$NON
HRLI REG2,(point 7,)
MOVE REG1,[point 7,ABUF]
DL$NC1: ILDB REG3,REG1
ILDB REG4,REG2
CAIE REG3,(REG4)
JRST DL$NON
JUMPN REG3,DL$NC1
CAIG IOREG," "
RETURN SKIP,1
AOJA FLAG,DL$NIN
DL$NON: CAIL FLAG,LBSIZE-2
JRST DL$NER
SETZM GBUF1+1(FLAG)
HRL REG1,GBUF1+1(FLAG)
HRR REG1,GBUF1+2(FLAG)
BLT REG1,<GBUF1+LBSIZE-1>
MOVE REG1,[point 7,ABUF]
SKIPN REG2,GBUF1(FLAG)
HRR REG2,GBUF2
HRLI REG2,(point 7,)
HRRZI BPREG,(BPREG)
SUBI BPREG,<ABUF-1>
ADDI BPREG,(REG2)
CAIL BPREG,<GBUF2+LBSIZE>
JRST DL$NER
HRRZM REG2,GBUF1(FLAG)
DL$NO1: ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,DL$NO1
HRRZI REG2,1(REG2)
MOVEM REG2,GBUF2
MOVEI UTIL,(FLAG)
JUMPE R10,DL$NO2
TSOUT <CRLF>
DL$NO2: TSOUT <[ASCIZ/ /]>
SOJGE UTIL,DL$NO2
TSOUT <ABUF>
SETO R10,
CAIG IOREG," "
RETURN SKIP,1
AOJA FLAG,DL$NIN
DL$NER: TSOUT <[ASCIZ/ (Pathname too long.)/],CRLF>
ENDR
; DPUT -- PUT-STORE
;
DPUT: BEGINR <IOREG>
; (((TENEX)))
IFG F.TENX,<
GJINF
CAME REG2,LDIR
CALLR D$CON
>
; (((↑↑↑)))
CALLR LOCFFI
RETURN
SKIPN OPENED
JRST DPUT3
MOVE REG1,[440700,,OPENED]
MOVE REG2,[440700,,NBUF]
DPUT1: ILDB REG3,REG1
ILDB REG4,REG2
CAIE REG3,(REG4)
JRST DPUT2
JUMPN REG3,DPUT1
MOVEI REG1,1
CAMN REG1,OPENEM
JRST DPUT5
DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVEI REG1,1
MOVEM REG1,OPENEM
JRST DPUT5
DPUT2: SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
DPUT3: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST DPUT4
DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVE REG1,[440700,,NBUF]
MOVE REG2,[440700,,OPENED]
SCOPY (REG1,REG2)
MOVEI REG1,1
MOVEM REG1,OPENEM
JRST DPUT5
DPUT4: DCSOUT <[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
TSOUT <[ASCIZ/ [New <FILES>]/],CRLF>
MOVE REG1,[440700,,NBUF]
MOVE REG2,[440700,,OPENED]
SCOPY (REG1,REG2)
SETZM OPENEM
DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVEI REG1,1
MOVEM REG1,OPENEM
SETZM VBUF
JRST DPUT6
DPUT5: SETZM VBUF
SETZ IOREG,
CALLR D$VER
RETURN
DPUT6: AOS VBUF
DCSOUT <[ASCIZ/"<FILES">="<PUT">/],SEMI>
CALLR NETOO
THUD
MOVE IOREG,[ASCII/;I239/]
CALLR RENFIP
RETURN
CALLR RENLIN
TSOUT <[ASCIZ/ [OK]/],CRLF>
SETZM NSUM
CALLR LOCOI
THUD
CALLR NETFFI
DPUT7: CALLR PUTFIL
CALLR PUTDAT
SKIPE FLAGTT
CALLR NETRAT
CALLR LOCNFI
JRST DPUT7
CALLR NETC
MOVE IOREG,[ASCII/;I259/]
CALLR RENFIP
RETURN
CALLR RENLIN
CALLR NETSUM
SETOM FLAGDE
CALLR RENDER
RETURN
ENDR SKIP,1
; DREM -- DELETE NODES
;
DREM: BEGINR
DCSOUT <[ASCIZ/DELETE /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
DCSOUT <[ASCIZ/LIST /],CONTEX,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
RETURN
TSOUT <[ASCIZ/ [Connected To Attached Node]/],CRLF>
MOVE REG1,[ASCII/%LOGI/]
MOVEM REG1,CONTEX
MOVE REG1,[ASCII/N/]
MOVEM REG1,<CONTEX+1>
ENDR
; DUND -- UNDELETE
;
DUND: BEGINR <IOREG>
SETZ IOREG,
CALLR D$OPEN
RETURN
movei IOREG,"d"
CALLR D$VER
RETURN
DCSOUT <[ASCIZ/BEGIN
DECLARE UNDELETED INTEGER
UNDELETED=0
UPDATE FILES IN "<FILES">/]>
HRRZI IOREG,[ASCIZ/ STATUS EQ 'D'/]
CALLR D$WITH
DCSOUT <DUNDS>
SETOM FLAGDE
CALLR RENDEM
RETURN
CALLR RENDER
RETURN
ENDR
DUNDS: ASCIZ/
BEGIN
STATUS=' '
UNDELETED=UNDELETED+1
COMMENT FILES.FILE.HEADER.FILENAME
! '.' ! FILES.FILE.HEADER.EXTENSION
! ';' ! FILES.FILE.HEADER.VERSION
END
IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
END;
/
; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT: BEGINR <IOREG,BPREG,UTIL>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$IN0
TSOUT <[ASCIZ/ ?? DATACOMPUTER INITIALIZATION FAILURE ??/],CRLF>
JRST QUIT
D$IN0: TSOUT <[ASCIZ/ [Attaching]/],CRLF>
HRRZI UTIL,HOSTS
D$IN1: SKIPN (UTIL)
JRST D$IND
HLRZ REG1,(UTIL)
CAME REG1,LHOST
AOJA UTIL,D$IN1
MOVE IOREG,[point 7,[ASCIZ/%TOP.DFTP./]]
MOVE BPREG,[point 7,ABUF]
SCOPY (IOREG,BPREG)
HRR IOREG,(UTIL)
HRLI IOREG,(point 7,)
SCOPY (IOREG,BPREG)
MOVEI IOREG,"."
IDPB IOREG,BPREG
; (((ITS)))
IFL F.TENX,<
.SUSET [.RXUNAME,,UBUF1]
SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
MOVE REG1,[-1,,31]
MOVE REG2,[-1,,32]
GETTAB REG1,
THUD
GETTAB REG2,
THUD
MOVEM REG1,UBUF1
MOVEM REG2,<UBUF1+1>
SETZM <UBUF1+2>
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
GETPPN REG1,
JFCL
TRNN REG1,770000
JRST [ LSH REG1,↑D6
JRST .-1] ; Left Justify SAIL PN's
HRLZM REG1,UBUF1
SETZM UBUF1+1
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((ITS+TOPS-10)
IFLE F.TENX,<
MOVE REG1,[point 6,UBUF1]
MOVEI REG2,42
ILDB REG3,REG1
JUMPE REG3,.+7
ADDI REG3,40
CAIL REG3,"A"
CAILE REG3,"Z"
IDPB REG2,BPREG
IDPB REG3,BPREG
JRST .-7
MOVE REG1,BPREG
IDPB REG3,REG1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
GJINF
CAMN REG1,REG2
JRST .+10
HRROI REG1,[ASCIZ/ (from /]
PSOUT
MOVEI REG1,101
DIRST
THUD
HRROI REG1,[ASCIZ/)
/]
PSOUT
HRROI REG1,UBUF1
DIRST
THUD
MOVE REG1,[point 7,UBUF1]
MOVEI REG2,42
ILDB REG3,REG1
JUMPE REG3,.+6
CAIL REG3,"A"
CAILE REG3,"Z"
IDPB REG2,BPREG
IDPB REG3,BPREG
JRST .-6
MOVE REG1,BPREG
IDPB REG3,REG1
>
; (((↑↑↑)))
DCSOUT <[ASCIZ/LOGIN /],ABUF,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$INP
D$IND: MOVE REG1,[point 7,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
MOVE REG2,[point 7,ABUF]
SCOPY (REG1,REG2)
DCSOUT <[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
TSOUT <[ASCIZ/ (as DFTP.GUEST)/],CRLF>
D$INP: DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<TERSE"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
MOVE UTIL,[ASCII/%LOGI/]
MOVEM UTIL,CONTEX
MOVE UTIL,[ASCII/N/]
MOVEM UTIL,<CONTEX+1>
SETZM OPENED
CALLR D$CON
ENDR
; D$CON -- CONNECT
;
D$CON: BEGINR <UTIL>
CALLR NETDSI
DCSOUT <[ASCIZ/CONNECT "<GET"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
CALLR NETDSO
DCSOUT <[ASCIZ/CONNECT "<PUT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
; (((TENEX)))
IFG F.TENX,<
GJINF
MOVEM REG2,LDIR
>
; (((↑↑↑)))
ENDR
; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
; IN: IOREG -- MODE FLAG
; READ IF < 0
; WRITE IF = 0
; APPEND IF > 0
;
D$OPEN: BEGINR
SKIPN OPENED
JRST D$OP05
MOVE REG1,[point 7,OPENED]
MOVE REG2,[point 7,NBUF]
D$OP01: ILDB REG3,REG1
ILDB REG4,REG2
CAIE REG3,(REG4)
JRST D$OP05
JUMPN REG3,D$OP01
CAMN IOREG,OPENEM
RETURN SKIP,1
JUMPE IOREG,D$OP02
JUMPG IOREG,D$OP03
DCSOUT <[ASCIZ/MODE "<FILES"> READ/],SEMI>
JRST D$OP04
D$OP02: DCSOUT <[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
JRST D$OP04
D$OP03: DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04: SETOM FLAGDE
CALLR RENDER
RETURN
MOVEM IOREG,OPENEM
RETURN SKIP,1
D$OP05: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$OP06
TSOUT <[ASCIZ/ (There are no <FILES>.)/],CRLF>
RETURN
D$OP06: SKIPN OPENED
JRST D$OP07
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
D$OP07: JUMPE IOREG,D$OP08
JUMPG IOREG,D$OP09
DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
JRST D$OP10
D$OP08: DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
JRST D$OP10
D$OP09: DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10: SETOM FLAGDE
CALLR RENDER
RETURN
MOVE REG1,[point 7,NBUF]
MOVE REG2,[point 7,OPENED]
SCOPY (REG1,REG2)
MOVEM IOREG,OPENEM
ENDR SKIP,1
; D$VER -- PRODUCE PROPER VERSION NUMBER
; IN: IOREG -- DEFAULT FLAG
; SMALLEST undeleted VERSION IF < 0
; LARGEST VERSION IF = 0
; largest deleted version if = "d"
; LARGEST UNDELETED VERSION IF = " "
; OUT: IOREG -- VERSION (IF DEFAULT)
;
D$VER: BEGINR <UTIL>
SKIPE VBUF
RETURN SKIP,1
JUMPE IOREG,D$VER1
LDB UTIL,[350700,,FBUF]
CAIN UTIL,"*"
SETOM VBUF
LDB UTIL,[350700,,EBUF]
CAIN UTIL,"*"
SETOM VBUF
SKIPE VBUF
RETURN SKIP,1
JUMPG IOREG,D$VER2
DCSOUT <[ASCIZ/BEGIN
DECLARE LEAST INT
LEAST=-1
FOR "<FILES">
WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
and (status eq ' ')/],[asciz/
BEGIN
IF LEAST EQ -1 THEN LEAST=VERSION ELSE
IF LEAST GT VERSION THEN LEAST=VERSION
END
IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
COMMENT '}' ! LEAST
END/],SEMI>
JRST D$VERE
D$VER1: DCSOUT <[ASCIZ/BEGIN
DECLARE GREATEST INT
GREATEST=0
FOR "<FILES">/]>
CALLR D$WITH
DCSOUT <[ASCIZ/
BEGIN
IF GREATEST LT VERSION THEN GREATEST=VERSION
END
COMMENT '}' ! GREATEST
END/],SEMI>
JRST D$VERE
D$VER2: DCSOUT <[ASCIZ/BEGIN
DECLARE GREATEST INT
GREATEST=-1
FOR "<FILES">
WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
AND (STATUS EQ '/]>
DCBOUT <IOREG>
SKIPN FLAGDD
JRST D$VER$
TBOUT <IOREG>
D$VER$: DCSOUT <[ASCIZ/')
BEGIN
IF GREATEST LT VERSION THEN GREATEST=VERSION
END
IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
COMMENT '}' ! GREATEST
END/],SEMI>
D$VERE: SETOM FLAGDE
CALLR RENDEM
RETURN
MOVE IOREG,[ASCII/;A282/]
CALLR RENFIP
RETURN
D$VERN: DCBIN <IOREG>
CAIE IOREG,"}"
JRST D$VERN
CALLR DCNIN
MOVEM IOREG,VBUF
CALLR RENLIN
CALLR RENDER
RETURN
ENDR SKIP,1
; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
; IN: IOREG -- POINTER TO FIXED QUALIFIER (OR 0)
; FLAGS:
D$W$F==400000
D$W$E==200000
D$W$V==100000
D$W$Q==010000
;
D$WITH: BEGINR <UTIL,FLAG>
SETZ FLAG,
LDB UTIL,[350700,,FBUF]
CAIE UTIL,"*"
TRO FLAG,D$W$F
LDB UTIL,[350700,,EBUF]
CAIE UTIL,"*"
TRO FLAG,D$W$E
SKIPLE VBUF
TRO FLAG,D$W$V
SKIPE IOREG
TRO FLAG,D$W$Q
JUMPE FLAG,RETN(0)
DCSOUT <[ASCIZ/ WITH/]>
TRNN FLAG,D$W$F
JRST D$WIT1
DCSOUT <[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
TRNN FLAG,D$W$E!D$W$V!D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT1: TRNN FLAG,D$W$E
JRST D$WIT2
DCSOUT <[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
TRNN FLAG,D$W$V!D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT2: TRNN FLAG,D$W$V
JRST D$WIT3
DCSOUT <[ASCIZ/ VERSION EQ /]>
MOVE UTIL,VBUF
DCNOUT <UTIL>
TRNN FLAG,D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT3: TRNN FLAG,D$W$Q
RETURN
DCSOUT <(IOREG)>
ENDR
; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM: BEGINR <IOREG,FLAG>
CALLR RENPRE
CAME IOREG,[ASCII/;I275/]
JRST NETS2
SETZ FLAG,
NETS1: DCBIN <IOREG>
CAIE IOREG,"="
JRST NETS1
SKIPN FLAG
SOJA FLAG,NETS1
CALLR DCNIN
CAME IOREG,NSUM
JRST NETS3
CALLR RENLIN
RETURN
NETS2: CALLR RENLIP
RETURN
NETS3: CALLR RENLIN
TSOUT <[ASCIZ/ (Network Checksum Error.)/],CRLF>
ENDR
; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT: BEGINR <IOREG,<IOREG+1>>
TSOUT <[ASCIZ/ (/]>
MOVEI IOREG,↑D36
IMULB IOREG,NSIZE
IDIV IOREG,NTIME
TNOUT <IOREG>
TSOUT <[ASCIZ/ Baud (/]>
MOVE IOREG,NSIZE
TNOUT <IOREG>
TSOUT <[ASCIZ/ bits in /]>
MOVE IOREG,NTIME
CAIN IOREG,0
MOVEI IOREG,1
TNOUT <IOREG>
HRRZI <IOREG+1>,[ASCIZ/ seconds))/]
CAIN IOREG,1
HRRZI <IOREG+1>,[ASCIZ/ second))/]
TSOUT <(IOREG+1),CRLF>
ENDR
; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER: BEGINR <IOREG,UTIL,FLAG>
SETZ FLAG,
RENDSL: CALLR RENPRE
CAMN IOREG,[ASCII/.I220/]
JRST RENDES
CAMN IOREG,[ASCII/.I210/]
JRST RENDRR
CAMN IOREG,[ASCII/;A282/]
JRST RENDPM
CAMN IOREG,[ASCII/.J151/]
JRST RENDPM
LDB UTIL,[350700,,IOREG]
cain util,"+"
jrst rendmm
CAIN UTIL,"-"
JRST RENDMM
JRST RENDFL
RENDMM: SETO FLAG,
SKIPN FLAGDE
JRST RENDFL
SETZM FLAGDE
RENDPM: CALLR RENLIP
JRST RENDSL
RENDFL: CALLR RENLIN
JRST RENDSL
RENDES: CALLR RENLIN
MOVEI IOREG,"L"-100
DCBOUT <IOREG>
SETO FLAG,
JRST RENDSL
RENDRR: CALLR RENLIN
JUMPN FLAG,RETN(0)
ENDR SKIP,1
; RENDEM -- REQUEST ENDER FOR MULTIPLE LINE REQUESTS
;
RENDEM: BEGINR <IOREG,UTIL,FLAG>
SETZ FLAG,
RENMSL: CALLR RENPRE
CAMN IOREG,[ASCII/.I210/]
JRST RENMFL
CAMN IOREG,[ASCII/.I220/]
JRST RENMES
LDB UTIL,[350700,,IOREG]
CAIN UTIL,"+"
JRST RENMMM
CAIN UTIL,"-"
JRST RENMMM
JRST RENMEM
RENMMM: SKIPN FLAG
MOVEI FLAG,-1
SKIPN FLAGDE
JRST RENMEM
SETZM FLAGDE
CALLR RENLIP
JRST RENMER
RENMEM: CALLR RENLIN
RENMER: JUMPN FLAG,RENMSL
RETURN SKIP,1
RENMFL: CALLR RENLIN
JUMPE FLAG,RENMSL
RETURN
RENMES: CALLR RENLIN
JUMPL FLAG,RENMSL
MOVEI IOREG,"L"-100
DCBOUT <IOREG>
SETO FLAG,
JRST RENMSL
ENDR
; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
; IN: IOREG -- PREFIX
;
RENFIP: BEGINR <BPREG,UTIL,FLAG>
MOVE FLAG,IOREG
SETZ UTIL,
RENFIL: CALLR RENPRE
CAMN IOREG,FLAG
RETURN SKIP,1
LDB BPREG,[350700,,IOREG]
CAIN BPREG,";"
JRST RENFIN
CAIN BPREG,"."
JRST RENFIN
SKIPN UTIL
CALLR RENLIP
SKIPE UTIL
CALLR RENLIN
AOJA UTIL,RENFIL
CALLR RENLIP
JRST RENFIL
RENFIN: CALLR RENLIN
CAMN IOREG,[ASCII/.I220/]
JRST RENFIS
CAMN IOREG,[ASCII/.I210/]
RETURN
JRST RENFIL
RENFIS: MOVEI IOREG,"L"-100
DCBOUT <IOREG>
CALLR RENDER
RETURN
ENDR
; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN: BEGINR <IOREG>
RENLNL: DCBIN <IOREG>
CAIE IOREG,12
JRST RENLNL
ENDR
; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP: BEGINR <IOREG>
SKIPN FLAGDD
JRST RENLPF
RENLPL: DCBIN <IOREG>
CAIE IOREG,12
JRST RENLPL
RETURN
RENLPF: DCBIN <IOREG>
CAIN IOREG,12
RETURN
CAIE IOREG,11
JRST RENLPF
MOVEI IOREG," "
TBOUT <IOREG>
MOVEI IOREG,"("
RENLPP: TBOUT <IOREG>
DCBIN <IOREG>
CAIE IOREG,15
JRST RENLPP
DCBIN <IOREG>
MOVEI IOREG,")"
TBOUT <IOREG>
TSOUT <CRLF>
ENDR
; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
; OUT: IOREG -- ASCII PREFIX (5 BYTES)
;
RENPRE: BEGINR <BPREG,UTIL,FLAG>
renprp: SETZ IOREG,
MOVE BPREG,[point 7,IOREG]
MOVEI FLAG,5
RENPRL: DCBIN <UTIL>
CAIN UTIL,15
JRST RENPRL
CAIN UTIL,12
JRST RENPRL
IDPB UTIL,BPREG
SOJG FLAG,RENPRL
ldb util,[350700,,ioreg]
cain util,"?"
jrst death
caie util,"!"
return
callr renlip
jrst renprp
ENDR
; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH: CALLR RENLIP
TSOUT <[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
.VALUE
.BREAK 16,160000
>
; (((TOPS-10)))
IFE F.TENX,<
EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
HALTF
JRST .-1
>
; (((↑↑↑)))
; ***I/O ROUTINES***
; TAIN -- TERMINAL AUTHORIZATION INPUT
; IN: REG1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$: BEGINR <IOREG>
MOVEI IOREG,(REG1)
TSOUT <(IOREG)>
TAIN1: TBIN <IOREG>
CAIN IOREG,15
JRST TAIN1
CAIN IOREG,"R"-100
JRST TAIN1
CAIN IOREG,"N"
JRST TAIN2
CAIN IOREG,"Y"
JRST TAIN3
CAIN IOREG,12
JRST TAIN4
CAIN IOREG,33
JRST TAIN4
CAIN IOREG,37
JRST TAIN4
CAIN IOREG," "
JRST TAIN4
TSOUT <[ASCIZ/XXX/],CRLF>
RETURN
TAIN2: TSOUT <[ASCIZ/No/],CRLF>
RETURN SKIP,1
TAIN3: TSOUT <[ASCIZ/Yes/]>
TAIN4: TSOUT <CRLF>
ENDR SKIP,2
; TERMINAL COMMAND INPUT ROUTINE
;
; WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
; INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
; IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
; LINE FEED, EOL, OR SPACE WILL FINISH IT.
; IF NOT, SUCH CHARACTERS WILL BE REJECTED.
; ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
; ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
; IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
; POINTER TO COMMAND STRING LIST
; NUMBER OF COMMANDS
; NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
; NUMBER OF WORDS IN LARGEST COMMAND STRING
; <VALUE LIST>
; <COMMAND STRING LIST>
; OUT: TCIO -- LAST CHAR INPUT
; FLAG -- COMMAND VALUE
; RETURNS: SKIP,0 -- DELETE LINE
; SKIP,1 -- NULL COMMAND
; SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$: BEGINR <TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
MOVE TCIACB,TCIO
SETZ UTIL,
TCII01: MOVEM UTIL,TCIPCL(UTIL)
ADDI UTIL,1
CAME UTIL,1(TCIACB)
JRST TCII01
ADDI UTIL,TCIPCL
MOVEM UTIL,TCIPNF
HRRI UTIL,TCIPCL
HRL UTIL,1(TCIACB)
MOVEM UTIL,TCIPLP
MOVE TCIBP,[point 7,ABUF]
HRLI TCISBP,350700
HRR TCISBP,(TCIACB)
SETZ TCISCC,
TCICHR: TBIN <TCIO>
CAIN TCIO,"R"-100
JRST TCIREP
CAIN TCIO,"?"
JRST TCIQUA
CAIN TCIO,"A"-100
JRST TCIDEL
CAIN TCIO,"X"-100
JRST TCIENR
CAIN TCIO,177
JRST TCIENR
CAIN TCIO,15
JRST TCICHR
CAIN TCIO,12
JRST TCIC01
CAIN TCIO,37
JRST TCIC01
CAIN TCIO," "
JRST TCIC01
CAIN TCIO,33
JRST TCIC01
CAIG TCIO," "
JRST TCIBAD
JRST TCIC02
TCIC01: JUMPE TCISCC,TCIENN
HLRZ UTIL,TCIPLP(TCISCC)
CAIN UTIL,1 ; OK IF JUST ONE POSSIBILITY
JRST TCIEND
TCIC02: SETZ TCIPCC,
MOVE TCIPBP,TCISBP
MOVE UTIL,TCIPNF
MOVEM UTIL,<TCIPLP+1>(TCISCC)
SETZ TCIMAC,
HRRZI TCIMAN,-1
TCIC03: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC04
CAIE UTIL,(TCIO)
JRST TCIC08
TCIC04: HLRZ TCITCC,TCIPLP(TCISCC)
HRRZ TCITLP,TCIPLP(TCISCC)
TCIC05: MOVE UTIL,(TCITLP)
CAIN UTIL,(TCIPCC)
JRST TCIC06
AOJ TCITLP,
SOJG TCITCC,TCIC05
JRST TCIC08
TCIC06: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC07
AOJ TCIMAC,
MOVEM TCIPCC,@TCIPNF
AOS TCIPNF
JRST TCIC08
TCIC07: CAIN TCIMAN,-1
SETO TCIMAN,
CAIE TCIMAN,-1
HRRZI TCIMAN,(TCIPCC)
TCIC08: ADD TCIPBP,3(TCIACB)
AOJ TCIPCC,
CAME TCIPCC,1(TCIACB)
JRST TCIC03
CAIN TCIO,12
JRST TCIC09
CAIN TCIO,37
JRST TCIC09
CAIN TCIO," "
JRST TCIC09
CAIE TCIO,33
JRST TCIC10
TCIC09: JUMPL TCIMAN,TCIBAD
CAIN TCIMAN,-1
JRST TCIBAD
JRST TCIEND
TCIC10: JUMPE TCIMAC,TCIBAD
AOJ TCISCC,
HRLM TCIMAC,TCIPLP(TCISCC)
IBP TCISBP
IDPB TCIO,TCIBP
TBOUT <TCIO> ; ECHO
JRST TCICHR
TCIBAD: MOVEI TCIO,"G"-100
TBOUT <TCIO>
JRST TCICHR
TCIREP: TSOUT <CRLF>
HLRZ UTIL,TCIACB
TSOUT <(UTIL)>
HRRZI TCIPCC,(TCISCC) ; OUTPUT LOOP CONTROL = CHARS SO FAR
MOVE TCIPBP,[point 7,ABUF]
TCIR01: SOJL TCIPCC,TCICHR
ILDB TCIO,TCIPBP
TBOUT <TCIO>
JRST TCIR01
TCIQUA: TBOUT <TCIO> ; PRINT "?"
HLRZ TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
HRRZ TCIPBP,TCIPLP(TCISCC)
TCIQ01: TSOUT <CRLF>
MOVEI TCIO,11
TBOUT <TCIO>
MOVE TCITCC,2(TCIACB)
MOVE TCITLP,(TCIPBP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,(point 7,)
TCIQ02: ILDB TCIO,TCITLP
JUMPE TCIO,TCIQ03
TBOUT <TCIO>
SOJG TCITCC,TCIQ02
TCIQ03: AOJ TCIPBP,
SOJG TCIPCC,TCIQ01
JRST TCIREP
TCIDEL: JUMPLE TCISCC,TCIBAD ; THERE'S NO CHARACTER TO DELETE
MOVEI TCIO,"\"
TBOUT <TCIO>
LDB TCIO,TCIBP
TBOUT <TCIO>
SOJ TCIBP, ; FIX LINE BYTE PTR
IBP TCIBP
IBP TCIBP
IBP TCIBP
IBP TCIBP
HRRZ UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
MOVEM UTIL,TCIPNF
SOJ TCISBP, ; FIX SCAN BYTE PTR
IBP TCISBP
IBP TCISBP
IBP TCISBP
IBP TCISBP
SOJA TCISCC,TCICHR
TCIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETZ FLAG,
RETURN
TCIENN: SETZ FLAG,
RETURN SKIP,1
TCIEND: MOVE TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
MOVE TCITLP,(TCITLP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,(point 7,)
SETZ TCITCC,
TCIE01: IBP TCITLP
AOJ TCITCC,
CAIE TCITCC,(TCISCC)
JRST TCIE01
TCIE02: AOJ TCITCC,
CAMLE TCITCC,2(TCIACB)
JRST TCIE03
ILDB TCIMAC,TCITLP
JUMPE TCIMAC,TCIE03
TBOUT <TCIMAC>
JRST TCIE02
TCIE03: MOVE TCITLP,TCIPLP(TCISCC)
MOVE FLAG,(TCITLP)
ADDI FLAG,4(TCIACB)
MOVE FLAG,(FLAG)
ENDR SKIP,2
; TERMINAL STRING INPUT
; IN: IOREG -- POINTER TO BUFFER,,SIZE OF BUFFER
; UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
; OUT: IOREG -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
; UTIL -- COUNT OF CHARACTERS
;
$TSIN$: BEGINR <BPREG,R10,R11,R12>
MOVE R10,IOREG
MOVE R11,UTIL
HLR BPREG,IOREG
HRLI BPREG,(point 7,)
SETZ UTIL,
TSICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST TSIREP
CAIN IOREG,"A"-100
JRST TSIDEL
CAIN IOREG,"X"-100
JRST TSIENR
CAIN IOREG,177
JRST TSIENR
CAIN IOREG,15
JRST TSICHR
CAIN IOREG,12
JRST TSIEND
CAIN IOREG,33
JRST TSIEND
CAIN IOREG,37
JRST TSIEND
CAIGE IOREG," "
JRST TSIBAD
CAIL UTIL,(R10)
JRST TSIBAD
IDPB IOREG,BPREG
ADDI UTIL,1
JUMPL R11,TSICHR
TBOUT <IOREG>
JRST TSICHR
TSIBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST TSICHR
TSIREP: TSOUT <CRLF>
TSOUT <(R11)>
JUMPL R11,TSICHR
HRRZI IOREG,(BPREG)
HLR R12,R10
CAIGE IOREG,(R12)
JRST TSICHR
HRLI R12,(point 7,)
TSIR01: CAMN R12,BPREG
JRST TSICHR
ILDB IOREG,R12
TBOUT <IOREG>
JRST TSIR01
TSIDEL: JUMPE UTIL,TSIBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
SUBI UTIL,1
JUMPL R11,TSICHR
TBOUT <IOREG>
JRST TSICHR
TSIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETO IOREG,
SETZ UTIL,
RETURN
TSIEND: SETZ R12,
IDPB R12,BPREG
ENDR SKIP,1
; TERMINAL NUMBER INPUT
; IN: IOREG -- POINTER TO ↑R TEXT,,RADIX
; OUT: IOREG -- NUMBER
;
$TNIN$: BEGINR <BPREG,UTIL,FLAG>
MOVE UTIL,IOREG
MOVE BPREG,[point 7,UBUF1]
SETZ FLAG,
TNICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST TNIREP
CAIN IOREG,"A"-100
JRST TNIDEL
CAIN IOREG,"X"-100
JRST TNIENR
CAIN IOREG,177
JRST TNIENR
CAIN IOREG,15
JRST TNICHR
CAIN IOREG,12
JRST TNIEND
CAIN IOREG,33
JRST TNIEND
CAIN IOREG,37
JRST TNIEND
CAIN IOREG," "
JRST TNIEND
CAIGE IOREG,"0"
JRST TNIBAD
CAIL IOREG,"0"(UTIL)
JRST TNIBAD
CAILE FLAG,12 ; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
JRST TNIBAD
IDPB IOREG,BPREG
TBOUT <IOREG>
AOJA FLAG,TNICHR
TNIBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST TNICHR
TNIREP: TSOUT <CRLF>
HLRZ IOREG,UTIL
TSOUT <(IOREG)>
HRRZI IOREG,(BPREG)
CAIGE IOREG,UBUF1
JRST TNICHR
MOVE IOREG,[point 7,UBUF1]
TNIR01: CAMN IOREG,BPREG
JRST TNICHR
ILDB REG1,IOREG
TBOUT <REG1>
JRST TNIR01
TNIDEL: JUMPE FLAG,TNIBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
TBOUT <IOREG>
SOJA FLAG,TNICHR
TNIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETZ IOREG,
RETURN
TNIEND: SETZ IOREG,
IDPB IOREG,BPREG
MOVE BPREG,[point 7,UBUF1]
MOVEI FLAG,(UTIL)
TNICAL: ILDB UTIL,BPREG
JUMPE UTIL,RETN(1)
IMULI IOREG,(FLAG)
SUBI UTIL,"0"
ADDI IOREG,(UTIL)
JRST TNICAL
ENDR
; DCNIN -- DATACOMPUTER NUMBER INPUT
; OUT: IOREG -- 36-BIT MAGNITUDE INTEGER
;
DCNIN: BEGINR <<IOREG+1>,UTIL>
SETZ IOREG,
DCNIN1: DCBIN <UTIL>
CAIGE UTIL,"0"
RETURN
CAILE UTIL,"9"
RETURN
JUMPL IOREG,DCNIN2
MULI IOREG,↑D10
CAILE IOREG,1
JRST DCNIN2
CAIN IOREG,1
TLO <IOREG+1>,400000
MOVE IOREG,<IOREG+1>
ADDI IOREG,-"0"(UTIL)
JRST DCNIN1
DCNIN2: SETO IOREG,
JRST DCNIN1
ENDR
; $NOUT$ -- INTEGER OUTPUT
; IN: REG1 -- INTEGER
; REG2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$: BEGINR <FLAG>
MOVE FLAG,REG2
MOVE REG3,[point 7,UBUF1]
MOVEI REG4,1
JUMPGE REG1,NOUT1
LSHC REG1,-↑D35
LSH REG2,-1
DIVI REG1,(FLAG)
JRST .+2
NOUT1: IDIVI REG1,(FLAG)
ADDI REG2,60
IDPB REG2,REG3
SKIPE REG1
AOJA REG4,NOUT1
MOVE REG1,[point 7,UBUF2]
NOUT2: LDB REG2,REG3
IDPB REG2,REG1
SOJ REG3,
IBP REG3
IBP REG3
IBP REG3
IBP REG3
SOJG REG4,NOUT2
IDPB REG4,REG1
SKIPL FLAG
JRST NOUT3
DCSOUT <UBUF2>
RETURN
NOUT3: TSOUT <UBUF2>
ENDR
; ***SYSTEM DEPENDENT ROUTINES***
; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
.OPEN TTI,[.UAI,,'TTY'] ; TTY input
THUD
.CALL [ SETZ
SIXBIT/TTYGET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVEM ; first set of character groups
MOVEM ; second set of character groups
SETZM REG1] ; TTYSTS variable
THUD
TLO REG1,200 ; disable **MORE** processing
MOVE [030303,,030303] ; turn off echoing
.CALL [ SETZ
SIXBIT/TTYSET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVE ; first set of character groups
MOVE ; second set of character groups
SETZ REG1] ; TTYSTS variable
THUD
.OPEN TTO,[.UAO,,'TTY'] ; TTY output
THUD
.CALL [ SETZ ; host number
SIXBIT/NETHST/
MOVEI -1
MOVEM
SETZM LHOST]
THUD
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .UII!40050 ; OPEN on gensymmed socket, 32 bits
MOVEI ICP
[('NET')] ; network device
[-1] ; initial local socket is gensymmed
MOVEI DCSOKT ; initial foreign socket(DATACOMPUTER)
SETZI DCHOST] ; foreign host(CCA)
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI ICP
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
MOVE REG1,[ICP,,RCHBLK]
.RCHST REG1, ; get status of network channel
HRRE REG1,RCHBLK+4 ; get status of network
JUMPL REG1,NETDED ; network dead if .LE. 0
CAIN REG1,%NSCLI ; CLS w/ input?
JRST ICPWIN
CAIE REG1,%NSINP ; input available?
CAIN REG1,%NSOPN ; connection open?
JRST ICPWIN
JUMPN REG1,[THUD] ; any other condition is lossage
ICPCLS: TSOUT <[ASCIZ/Cannot establish network connection/]>
.BREAK 16,160000
NETDED: TSOUT <[ASCIZ/ARPAnet is down/]>
.BREAK 16,160000
ICPWIN: MOVE REG1,RCHBLK+1 ; get gensymmed local socket
ADDI REG1,2 ; receive
MOVEM REG1,LCLRCV
ADDI REG1,1 ; transmit
MOVEM REG1,LCLTRN
.IOT ICP,REG1 ; get foreign place's socket
.CLOSE ICP, ; free up ICP socket right away
MOVEM REG1,FORRCV ; receive
ADDI REG1,1 ; socket to me!
MOVEM REG1,FORTRN
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAI
MOVEI DCI ; DATACOMPUTER input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAO
MOVEI DCO ; DATACOMPUTER output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCI
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCO
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
MOVEI REG1,2 ; offset for data sockets
ADDM REG1,LCLRCV
ADDM REG1,LCLTRN
ADDM REG1,FORRCV
ADDM REG1,FORTRN
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: .IOT DCO,["Z"-100] ; SEND QUIT
QUIT1: DCBIN <IOREG>
JUMPGE IOREG,QUIT1
.CLOSE DCI,
.CLOSE DCO,
.BREAK 16,160000
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI DDI ; DATACOMPUTER data input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDI
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
RETURN SKIP,1
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI DDO ; DATACOMPUTER data output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDO
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
RETURN SKIP,1
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
.CLOSE DDI,
.CLOSE DDO,
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;
NETDSI: BEGINR
MOVE UTIL,LCLRCV
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;
NETDSO: BEGINR
MOVE UTIL,LCLTRN
ENDR
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI LCI
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOI1
RETURN SKIP,1
LOCOI1: TSOUT <[ASCIZ/ (Local file not found.)/],CRLF>
ENDR
;LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI LCO
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOO1
.CALL [ SETZ
SIXBIT/SFDATE/
MOVEI LCO
SETZ LCLDAT]
THUD
RETURN SKIP,1
LOCOO1: TSOUT <[ASCIZ/ ?? Local file creation failure ??/],CRLF>
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
.CLOSE LCI,
.CLOSE LCO,
ENDR
; LOCS -- LOCAL FILE (SIZE)
;
LOCS: BEGINR
.CALL [ SETZ
SIXBIT/FILLEN/
MOVEI LCI
SETZM IOREG]
SETZ IOREG, ; it should not crap out
ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
; IN: IOREG -- ADDRESS OF TIME STRING
; OUT: UTIL -- ITS DISK FORMAT DATE/TIME
;
LUTTSN: BEGINR <BPREG>
SETZ UTIL,
ILDB REG1,IOREG
CAIL REG1,"0"
CAILE REG1,"9"
RETURN
SUBI REG1,"0"
IMULI REG1,↑D10
ILDB REG2,IOREG
CAIL REG2,"0"
CAILE REG2,"9"
RETURN
ADDI REG1,-"0"(REG2)
ILDB REG2,IOREG
CAIE REG2,"-"
RETURN
MOVE REG2,[POINT 7,REG3]
SETZ REG3,
REPEAT 3,<
ILDB REG4,IOREG
IDPB REG4,REG2
>
MOVEI REG2,↑D12
CAMN REG3,LUTTM-1(REG2)
JRST .+3
SOJGE REG2,.-2
RETURN
ILDB REG3,IOREG
CAIE REG3,"-"
RETURN
ILDB REG3,IOREG
CAIL REG3,"0"
CAILE REG3,"9"
RETURN
SUBI REG3,"0"
IMULI REG3,↑D10
ILDB REG4,IOREG
CAIL REG4,"0"
CAILE REG4,"9"
RETURN
ADDI REG3,-"0"(REG4)
DPB REG3,[POiNT 7,UTIL,8]
DPB REG2,[POINT 4,UTIL,12]
DPB REG1,[POINT 5,UTIL,17]
ILDB REG1,IOREG
CAIE REG1," "
RETURN
ILDB REG1,IOREG
SUBI REG1,"0"
IMULI REG1,↑D10
ILDB REG2,IOREG
ADDI REG1,-"0"(REG2)
IMULI REG1,6
ILDB REG2,IOREG
CAIE REG2,":"
RETURN
ILDB REG2,IOREG
ADDI REG1,-"0"(REG2)
IMULI REG1,↑D10
ILDB REG2,IOREG
ADDI REG1,-"0"(REG2)
IMULI REG1,6
ILDB REG2,IOREG
CAIE REG2,":"
jrst [ IMULI REG1,↑D20
JRST LUTSN1]
ILDB REG2,IOREG
ADDI REG1,-"0"(REG2)
IMULI REG1,↑D10
ILDB REG2,IOREG
ADDI REG1,-"0"(REG2)
LSH REG1,1
LUTSN1: ADDI UTIL,(REG1)
ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
; IN: UTIL -- ITS DISK FORMAT DATE/TIME
; BPREG -- BYTE POINTER TO DESTINATION STRING
; OUT: BPREG -- UPDATED BYTE POINTER
;
LUTTNS: BEGINR
LDB REG3,[POINT 5,UTIL,17] ; DAY
IDIVI REG3,↑D10
ADDI REG3,"0"
ADDI REG4,"0"
IDPB REG3,BPREG
IDPB REG4,BPREG
MOVEI REG3,"-"
IDPB REG3,BPREG
LDB REG3,[POINT 4,UTIL,12] ; MONTH
HRRI REG3,LUTTM-1(REG3)
HRLI REG3,(POINT 7,)
SCOPY (REG3,BPREG)
MOVEI REG3,"-"
IDPB REG3,BPREG
LDB REG3,[POINT 7,UTIL,8] ; YEAR
IDIVI REG3,↑D10
ADDI REG3,"0"
ADDI REG4,"0"
IDPB REG3,BPREG
IDPB REG4,BPREG
MOVEI REG3," "
IDPB REG3,BPREG
LDB REG2,[POINT 17,UTIL,34] ; TIME IN SECONDS
IDIVI REG2,↑D3600
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,BPREG
IDPB REG3,BPREG
MOVEI REG2,":"
IDPB REG2,BPREG
MOVEI REG2,(REG4)
IDIVI REG2,↑D60
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,BPREG
IDPB REG3,BPREG
MOVEI REG2,":"
IDPB REG2,BPREG
MOVEI REG2,(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,BPREG
IDPB REG3,BPREG
SETZ REG2,
IDPB REG2,BPREG
ENDR ; return
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM: ASCII/JAN/
ASCII/FEB/
ASCII/MAR/
ASCII/APR/
ASCII/MAY/
ASCII/JUN/
ASCII/JUL/
ASCII/AUG/
ASCII/SEP/
ASCII/OCT/
ASCII/NOV/
ASCII/DEC/
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IOREG>
SETZM LCLFN1 ; < prevent assembly error
MOVSI REG1,'> '
MOVEM REG1,LCLFN2
HRLI IOREG,(POINT 7,)
LUTFN1: CALLR LUTWRD ; get a SIXBIT word
MOVEM REG1,LCLFN1
JUMPE REG2,RETN(0)
CAIE REG2,"."
JRST LUTFN1
CALLR LUTWRD
CAIE REG1,
MOVEM REG1,LCLFN2 ; use FN2 if specified
ENDR
; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN REG1, DELIMITER IN REG2
;
LUTWRD: BEGINR <BPREG>
SETZ REG1, ; initialize word, word pointer
MOVE BPREG,[POINT 6,REG1]
LUTWR1: ILDB REG2,IOREG ; get a character from buffer
CAIN REG2,"."
JRST RETN(0)
JUMPE REG2,RETN(0)
SUBI REG2," " ; SIXBITify from ASCII
TRNN REG1,77 ; and save in word until word filled
IDPB REG2,BPREG
JRST LUTWR1
ENDR
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI: BEGINR
SETZM FFITYP
SETO REG1,
CAME REG1,FSBUF
CAMN REG1,ESBUF
CAIA
JRST NETFI1
.IOT TTO,[" "]
.IOT TTO,["("]
SETOM FFITYP
NETFI1: MOVE REG1,[POINT 6,LCLFN1]
MOVEI REG2,6
MOVE REG3,[POINT 7,FBUF]
ILDB REG4,REG1
JUMPE REG4,.+4
ADDI REG4," "
SKIPE FFITYP
.IOT TTO,REG4
SKIPE GBUF1
IDPB REG4,REG3
SOJG REG2,.-7
NETFI2: SKIPE FFITYP
.IOT TTO,["."]
MOVE REG1,[POINT 6,LCLFN2]
MOVEI REG2,6
MOVE REG3,[POINT 7,EBUF]
ILDB REG4,REG1
JUMPE REG4,.+4
ADDI REG4," "
SKIPE FFITYP
.IOT TTO,REG4
SKIPE GBUF2
IDPB REG4,REG3
SOJG REG2,.-7
NETFI3: SKIPN FFITYP
RETURN
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <IOREG,BPREG,UTIL>
SETZM IOBUFR
MOVE REG1,[IOBUFR,,IOBUFR+1]
BLT REG1,IOBUFR+1777
.RDTIM REG1,
IDIVI REG1,↑D30
MOVEM REG1,NTIME
MOVE BPREG,[POINT 7,IOBUFR]
MOVE UTIL,[POINT 7,FBUF]
SCOPY (UTIL,BPREG)
MOVE BPREG,UTIL
MOVE UTIL,[POINT 7,EBUF]
SCOPY (UTIL,BPREG)
MOVE BPREG,UTIL
.CALL [ SETZ
SIXBIT/RFDATE/
MOVEI LCI
SETZM UTIL]
MOVSI UTIL,124201
CALLR LUTTNS
.CALL [ SETZ
SIXBIT/RQDATE/
SETZM UTIL]
MOVSI UTIL,124201
CALLR LUTTNS
HRLI BPREG,004400
MOVE UTIL,VBUF
IDPB UTIL,BPREG
CALLR LOCS
IDPB IOREG,BPREG
MOVNI UTIL,17
IDPB UTIL,BPREG
HRRZI BPREG,(BPREG)
MOVEI REG1,(BPREG)
SUBI BPREG,IOBUFR-1
MOVEM BPREG,NSIZE
SETZ UTIL,
ADD UTIL,(REG1)
SOJ REG1,
SOJG BPREG,.-2
ADDM UTIL,NSUM
MOVN REG1,NSIZE
HRLS REG1
HRRI REG1,IOBUFR
.IOT DDO,REG1
ENDR
; putdat -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
PUTDAT: BEGINR <UTIL,IOREG>
CALLR LOCS ; get length of file
AOS NSIZE
ADDM IOREG,NSUM
ADDM IOREG,NSIZE
MOVE REG1,[-1,,IOREG]
.IOT DDO,REG1
SETZ UTIL,
PUTD1: MOVE REG1,[-2000,,IOBUFR]
.IOT LCI,REG1 ; read 1K from local file
JUMPL REG1,PUTD2 ; hit EOF here
MOVE REG1,[-2000,,IOBUFR]
.IOT DDO,REG1
MOVSI REG1,-2000 ; compute checksum
ADD UTIL,IOBUFR(REG1)
AOBJN REG1,.-1
JRST PUTD1
PUTD2: MOVEI REG1,-IOBUFR(REG1) ; get # of words transferred
JUMPE REG1,PUTD3
MOVNS REG1
HRLZS REG1
PUSH STAK,REG1
HRRI REG1,IOBUFR
.IOT DDO,REG1
POP STAK,REG1
ADD UTIL,IOBUFR(REG1)
AOBJN REG1,.-1
PUTD3: ADDM UTIL,NSUM
ADDM UTIL,NSUM
MOVE REG1,[-1,,UTIL]
.IOT DDO,REG1
.RDTIM REG1,
IDIVI REG1,↑D30
SUBM REG1,NTIME
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <IOREG,UTIL>
.RDTIM REG1,
IDIVI REG1,↑D30
MOVEM REG1,NTIME
MOVE IOREG,[-GET$F,,FBUF]
.IOT DDI,IOREG
JUMPL IOREG,RETN(0)
MOVEI IOREG,GET$F
MOVEM IOREG,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(IOREG)
SOJG IOREG,.-1
ADDM UTIL,NSUM
MOVE IOREG,[-GET$E,,EBUF]
.IOT DDI,IOREG
MOVEI IOREG,GET$E
ADDM IOREG,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(IOREG)
SOJG IOREG,.-1
ADDM UTIL,NSUM
MOVE IOREG,[-GET$D,,ABUF]
.IOT DDI,IOREG
MOVEI IOREG,GET$D
ADDM IOREG,NSIZE
SETZ UTIL,
ADD UTIL,<ABUF-1>(IOREG)
SOJG IOREG,.-1
ADDM UTIL,NSUM
MOVE IOREG,[POINT 7,ABUF]
CALLR LUTTSN
MOVEM UTIL,LCLDAT
HRROI IOREG,ABUF
.IOT DDI,IOREG
AOS NSIZE
MOVE REG1,ABUF
ADDM REG1,NSUM
HRROI IOREG,ABUF
.IOT DDI,IOREG
AOS NSIZE
MOVE REG1,ABUF
ADDM REG1,NSUM
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT: BEGINR <IOREG,UTIL,FLAG>
HRROI IOREG,FLAG
.IOT DDI,IOREG
JUMPE FLAG,GETD3
ADDM FLAG,NSUM
AOS NSIZE
ADDM FLAG,NSIZE
SETZ UTIL,
GETD1: CAIGE FLAG,2000
JRST GETD2
SUBI FLAG,2000
MOVE REG1,[-2000,,IOBUFR]
.IOT DDI,REG1 ; read 1K from DATACOMPUTER
MOVE REG1,[-2000,,IOBUFR]
.IOT LCO,REG1
MOVSI REG1,-2000 ; compute checksum
ADD UTIL,IOBUFR(REG1)
AOBJN REG1,.-1
JRST GETD1
GETD2: JUMPE FLAG,GETD3
MOVN REG1,FLAG
HRLZS REG1
HRRI REG1,IOBUFR
PUSH STAK,REG1
.IOT DDI,REG1
MOVE REG1,(STAK)
.IOT LCO,REG1
POP STAK,REG1
ADD UTIL,(REG1)
AOBJN REG1,.-1
GETD3: ADDM UTIL,NSUM
HRROI IOREG,ABUF
.IOT DDI,IOREG
MOVE IOREG,ABUF
ADDM IOREG,NSUM
AOS NSIZE
HRROI IOREG,ABUF
.IOT DDI,IOREG
MOVE IOREG,ABUF
ADDM IOREG,NSUM
AOS NSIZE
CAMN IOREG,UTIL
JRST GETD4
TSOUT <[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD4: .RDTIM REG1,
IDIVI REG1,↑D30
SUBM REG1,NTIME
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR <IOREG>
SETZM GBUF1
LDB REG1,[350700,,FBUF]
CAIN REG1,"*"
SETOM GBUF1
SETZM GBUF2
LDB REG1,[350700,,EBUF]
CAIN REG1,"*"
SETOM GBUF2
SETO REG1,
CAMN REG1,FSBUF
JRST LOCFI0
CAMN REG1,ESBUF
JRST LOCFI0
JRST LOCFI5
LOCFI0: .OPEN [.BII,,'DSK'
SIXBIT/.FILE./
SIXBIT/(DIR)/]
RETURN
MOVE REG1,[-2000,,DIRBLK]
.IOT REG1
.CLOSE
LOCFI1: MOVE IOREG,DIRBLK+1 ; POINTER TO NAME AREA
ADDI IOREG,DIRBLK
CAIN IOREG,DIRBLK+2000 ; END OF DIRECTORY?
RETURN
MOVEI REG1,5
ADDM REG1,DIRBLK+1
SETO REG1,
CAME REG1,FSBUF
JRST LOCFI2
CAME REG1,ESBUF
JRST LOCFI3
JRST LOCFI4
LOCFI2: MOVE REG1,[POINT 7,FSBUF]
MOVE REG2,[POINT 6,REG4]
MOVEI REG3,6
SETZ REG4,
ILDB REG1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB REG2
SOJG REG3,.-6
CAMN REG4,(IOREG)
JRST LOCFI4
JRST LOCFI1
LOCFI3: MOVE REG1,[POINT 7,ESBUF]
MOVE REG2,[POINT 6,REG4]
SETZ REG4,
MOVEI REG3,6
ILDB REG1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB REG2
SOJG REG3,.-6
CAME REG4,1(IOREG)
JRST LOCFI1
LOCFI4: MOVE REG1,(IOREG)
MOVEM REG1,LCLFN1
MOVE REG1,1(IOREG)
MOVEM REG1,LCLFN2
LOCFI5: .CALL [ SETZ
SIXBIT/OPEN/
MOVSI .UAI
MOVEI
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
RETURN
.CLOSE
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR <IOREG>
CALLR LOCC
SETO REG1,
CAMN REG1,FSBUF
JRST LOCNI0
CAMN REG1,ESBUF
JRST LOCNI0
RETURN SKIP,1
LOCNI0: MOVE IOREG,DIRBLK+1
ADDI IOREG,DIRBLK
CAIN IOREG,DIRBLK+2000
RETURN SKIP,1
MOVEI REG1,5
ADDM REG1,DIRBLK+1
SETO REG1,
CAME REG1,FSBUF
JRST LOCNI1
CAME REG1,ESBUF
JRST LOCNI2
JRST LOCNI3
LOCNI1: MOVE REG1,[POINT 7,FSBUF]
MOVE REG2,[POINT 6,REG4]
MOVEI REG3,6
SETZ REG4,
ILDB REG1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB REG2
SOJG REG3,.-6
CAMN REG4,(IOREG)
JRST LOCNI3
JRST LOCNI0
LOCNI2: MOVE REG1,[POINT 7,ESBUF]
MOVE REG2,[POINT 6,REG4]
MOVEI REG3,6
SETZ REG4,
ILDB REG1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB REG2
SOJG REG3,.-6
CAME REG4,1(IOREG)
JRST LOCNI0
LOCNI3: MOVE REG1,(IOREG)
MOVEM REG1,LCLFN1
MOVE REG1,1(IOREG)
MOVEM REG1,LCLFN2
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI LCI
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCNI0
SKIPN GBUF1
JRST LOCNI4
MOVE REG1,[POINT 6,LCLFN1]
MOVEI REG2,6
MOVE REG3,[POINT 7,FBUF]
ILDB REG4,REG1
SKIPE REG4
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,.-4
LOCNI4: SKIPN GBUF2
JRST LOCNI5
MOVE REG1,[POINT 6,LCLFN2]
MOVEI REG2,6
MOVE REG3,[POINT 7,EBUF]
ILDB REG4,REG1
SKIPE REG4
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,.-4
LOCNI5: .IOT TTO,[" "]
.IOT TTO,["("]
TSOUT <FBUF>
.IOT TTO,["."]
TSOUT <EBUF>
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR <IOREG>
SETZ REG1,
SETO REG2,
CAMN REG2,FSBUF
TRO REG1,400000
CAMN REG2,ESBUF
TRO REG1,200000
JUMPE REG1,RETN(0)
MOVE REG2,[POINT 7,ABUF]
MOVE REG3,[POINT 7,FSBUF]
TRNE REG1,400000
HRRI REG3,FBUF
ILDB REG4,REG3
CAIN REG4," "
SETZ REG4,
IDPB REG4,REG2
JUMPN REG4,.-4
SKIPN ESBUF
JRST LOCNOO
MOVEI REG4,"."
DPB REG4,REG2
MOVE REG3,[POINT 7,ESBUF]
TRNE REG1,200000
HRRI REG3,EBUF
ILDB REG4,REG3
CAIN REG4," "
SETZ REG4,
IDPB REG4,REG2
JUMPN REG4,.-4
LOCNOO: MOVEI IOREG,ABUF
CALLR LUTFN
.IOT TTO,[" "]
.IOT TTO,["("]
TSOUT ABUF
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE 0,[SIXBIT/DFTP/]
SETNAM 0,
OPEN 0,[ 200 ; TURN OFF TTY ECHOING
SIXBIT /TTY/
0]
THUD
CALLR ICP
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <IOREG,UTIL>
MSTIME REG1,
IDIVI REG1,↑D1000
MOVEM REG1,NTIME
MOVE IOREG,[-GET$F,,FBUF]
CALLR NUTFB
RETURN
MOVEI IOREG,GET$F
MOVEM IOREG,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(IOREG)
SOJG IOREG,.-1
ADDM UTIL,NSUM
MOVE IOREG,[GET$E,,EBUF]
CALLR NUTFB
MOVEI IOREG,GET$E
ADDM IOREG,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(IOREG)
SOJG IOREG,.-1
ADDM UTIL,NSUM
MOVE IOREG,[GET$D,,ABUF]
CALLR NUTFB
MOVEI IOREG,GET$D
ADDM IOREG,NSIZE
SETZ UTIL,
ADD UTIL,<ABUF-1>(IOREG)
SOJG IOREG,.-1
ADDM UTIL,NSUM
MOVE IOREG,[point 7,ABUF]
CALLR LUTTSN
DPB IOREG,[001400,,LFILE+2]
LSH IOREG,-14
DPB IOREG,[170300,,LFILE+1]
DPB UTIL,[141300,,LFILE+2]
MOVE IOREG,[1,,ABUF]
CALLR NUTFB
AOS NSIZE
MOVE REG1,ABUF
ADDM REG1,NSUM
MOVE IOREG,[1,,ABUF]
CALLR NUTFB
AOS NSIZE
MOVE REG1,ABUF
ADDM REG1,NSUM
SKIPLE REG1
MOVE REG1,LFCHAS
SKIPGE REG1
MOVN REG1,REG1
DPB REG1,[270400,,LFILE+2]
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
GETDAT: BEGINR <IOREG,UTIL,FLAG>
MOVE IOREG,[1,,ABUF]
CALLR NUTFB
MOVE FLAG,ABUF
JUMPE FLAG,GETD2
ADDM FLAG,NSUM
AOS NSIZE
ADDM FLAG,NSIZE
OUT LFCHAN,
JRST .+2
THUD
SETZ UTIL,
GETD1: CAIGE FLAG,SIZBLK
HRLI IOREG,(FLAG)
CAIL FLAG,SIZBLK
HRLI IOREG,SIZBLK
HRR IOREG,LFOBUF+1
ADDI IOREG,1
CALLR NUTFB
CAIGE FLAG,SIZBLK
MOVEI IOREG,(FLAG)
CAIL FLAG,SIZBLK
MOVEI IOREG,SIZBLK
SUBI FLAG,(IOREG)
HRRZ REG1,LFOBUF+1
ADDM IOREG,LFOBUF+1
ADDI REG1,(IOREG)
ADD UTIL,(REG1)
SOJ REG1,
SOJG IOREG,.-2
OUT LFCHAN,
JRST .+2
THUD
JUMPG FLAG,GETD1
GETD2: ADDM UTIL,NSUM
MOVE IOREG,[1,,ABUF]
CALLR NUTFB
MOVE IOREG,ABUF
ADDM IOREG,NSUM
AOS NSIZE
MOVE IOREG,[1,,ABUF]
CALLR NUTFB
MOVE IOREG,ABUF
ADDM IOREG,NSUM
AOS NSIZE
CAMN IOREG,UTIL
JRST GETD3
TSOUT <[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD3: MSTIME REG1,
IDIVI REG1,↑D1000
MOVE REG2,NTIME
SUB REG1,REG2
MOVEM REG1,NTIME
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <IOREG,BPREG,UTIL>
OUT DDCHAN,
JRST .+2
THUD
MSTIME REG1,
IDIVI REG1,↑D1000
MOVEM REG1,NTIME
HRR BPREG,DDOBUF+1
HRLI BPREG,010700
MOVE UTIL,[point 7,FBUF]
SCOPY (UTIL,BPREG)
MOVE BPREG,UTIL
MOVE UTIL,[point 7,EBUF]
SCOPY (UTIL,BPREG)
MOVE BPREG,UTIL
LDB IOREG,[001400,,LFILE+2] ; CREATION DATE
LDB UTIL,[170300,,LFILE+1]
LSH UTIL,14
IORI IOREG,(UTIL)
LDB UTIL,[141300,,LFILE+2] ; CREATION TIME
CALLR LUTTNS
DATE IOREG,
MSTIME REG1,
IDIVI REG1,<↑D1000*↑D60>
MOVE UTIL,REG1
CALLR LUTTNS
HRLI BPREG,004400
MOVE UTIL,VBUF
IDPB UTIL,BPREG
CALLR LOCS
IDPB IOREG,BPREG
LDB UTIL,[270400,,LFILE+2] ; DATA MODE
SKIPE UTIL
MOVN UTIL,UTIL
IDPB UTIL,BPREG
HRRZ IOREG,DDOBUF+1
MOVEM BPREG,DDOBUF+1
HRRZI BPREG,(BPREG)
HRRZI REG1,(BPREG)
SUBI BPREG,-1(IOREG)
MOVEM BPREG,NSIZE
SETZ UTIL,
ADD UTIL,(REG1)
SOJ REG1,
SOJG BPREG,.-2
ADDM UTIL,NSUM
OUT DDCHAN,
JRST .+2
THUD
ENDR
; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT: BEGINR <IOREG,UTIL>
CALLR LOCS
AOS NSIZE
ADDM IOREG,NSUM
ADDM IOREG,NSIZE
AOS DDOBUF+1
MOVEM IOREG,@DDOBUF+1
OUT DDCHAN,
JRST .+2
THUD
SETZ UTIL,
PUTD1: sosg lfibuf+2
in lfchan,
caia
jrst putd2
ildb reg1,lfibuf+1
ADD UTIL,REG1
sosg ddobuf+2
out ddchan,
caia
thud
idpb reg1,ddobuf+1
jrst putd1
putd2: stato lfchan,20000
thud
aos nsize
ADDM UTIL,NSUM
ADDM UTIL,NSUM
AOS DDOBUF+1
MOVEM UTIL,@DDOBUF+1
OUT DDCHAN,
JRST .+2
THUD
MSTIME REG1,
IDIVI REG1,↑D1000
MOVE REG2,NTIME
SUB REG1,REG2
MOVEM REG1,NTIME
ENDR
; TOPS-10 ICP: 1) SET CONNECTION SOCKETS IN LISTENING STATE
; 2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 3) OPEN CONNECTION SOCKETS
; A) EVEN - RECEIVE
; B) ODD - SEND
;
ICP: BEGINR <IOREG,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG: SETZM ICPBLK+.IBDEV
SETZM DCIBLK+.IBDEV
SETZM DCOBLK+.IBDEV
SETZM DCIBLK+.IBRMT
SETZM DCOBLK+.IBRMT
MOVE IOREG,LINP ; LISTEN ON INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST .+2
JRST ICPICP
MOVE IOREG,DCIBLK+.IBERR
CAIE IOREG,.IESKT
JRST ICPEIL
MOVE IOREG,PWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
LDB REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,102
SETZ REG3,
SETZ FLAG,
ICPRDV: MOVE IOREG,[SIXBIT/IMP/] ; RESET DEVICE(S) USED
MOVEM IOREG,WRKBLK+.IBDEV
MOVEI REG1,(REG3)
IDIVI REG1,10
JUMPE REG1,ICPRD1
ADDI REG1,20
ADDI REG2,20
DPB REG1,[140600,,WRKBLK+.IBDEV]
DPB REG2,[060600,,WRKBLK+.IBDEV]
JRST ICPRD2
ICPRD1: ADDI REG2,20
DPB REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2: SETZM WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/] ; TEST STATUS OF SOCKET
JRST ICPRD3
HRRZ IOREG,WRKBLK+.IBHST ; FOREIGN HOST
CAIE IOREG,DCHOST
JRST ICPRD3
PJOB REG1,
HLRZ REG2,WRKBLK+.IBSTT ; OWNING JOB
CAIE REG2,(REG1)
JRST ICPRD3
MOVE IOREG,WRKBLK+.IBLCL
CAMN IOREG,UTIL ; DATALANGUAGE SOCKET(S)
JRST ICPCLS
SUBI IOREG,2
CAMN IOREG,UTIL ; INPUT DATA SOCKET
JRST ICPCLI
ICPRD3: MOVEI IOREG,1 ; OUTPUT DATA SOCKET
MOVEM IOREG,WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
HRRZ IOREG,WRKBLK+.IBHST
CAIE IOREG,DCHOST
JRST ICPRD4
PJOB REG1,
HLRZ REG2,WRKBLK+.IBSTT
CAIE REG2,(REG1)
JRST ICPRD4
MOVE IOREG,WRKBLK+.IBLCL
SUBI IOREG,3
CAMN IOREG,UTIL
JRST ICPCLO
ICPRD4: ADDI REG3,1
CAIGE REG3,(REG4)
JRST ICPRDV
JUMPN FLAG,ICPBEG
TTCALL 3,[ASCIZ/ (Connections in use.)/]
EXIT
ICPCLS: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVEI IOREG,1
MOVEM IOREG,WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ [Restarting]
/]
SETO FLAG,
JRST ICPRDV
ICPCLI: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ (Retrieve interrupted: connection closed.)
/]
JRST ICPRDV
ICPCLO: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ (Store interrupted: connection closed.)
/]
JRST ICPRDV
ICPICP: MOVE IOREG,DCIBLK+.IBDEV ; GET DEVICE NAME
MOVEM IOREG,DCOBLK+.IBDEV ; AND COPY IT FOR DUPLEX
MOVEM IOREG,DCCHAS+1
MOVE IOREG,LOUT ; LISTEN ON OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPEOL
MOVE IOREG,OICP
CALL IOREG,[SIXBIT/IMPUUO/] ; OPEN CONNECTION
JRST ICPEC
MOVE IOREG,ICPBLK+.IBDEV ; GET DEVICE NAME
MOVEM IOREG,ICCHAS+1
OPEN DCCHAN,ICCHAS ; OPEN AS STANDARD DEVICE
JRST ICPEF
IN DCCHAN,
JRST .+2
JRST ICPET
MOVE IOREG,ICPBUF+1
MOVE IOREG,1(IOREG) ; GET THE SOCKET NUMBER
LSH IOREG,-4 ; RIGHT JUSTIFY 32 BITS
MOVEM IOREG,DCOBLK+.IBRMT
AOJ IOREG,
MOVEM IOREG,DCIBLK+.IBRMT
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
MOVE IOREG,OINP ; OPEN INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEIC
MOVE IOREG,OOUT ; OPEN OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEOC
OPEN DCCHAN,DCCHAS
JRST NETECF
OUT DCCHAN,
JRST .+2
JRST NETEOT
MOVE IOREG,PWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST QUIT
HRRZ IOREG,WRKBLK+.IBHST
MOVEM IOREG,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK
STLOC==1 ; STATUS BITS RETURNED HERE
LSLOC==2 ; LOCAL SOCKET
WFLOC==3 ; WAIT FLAG
BSLOC==4 ; BYTE SIZE LOCATION
FSLOC==5 ; FOREIGN SOCKET
HLOC==6 ; HOST NUMBER
ERRBTS==763600 ; I/O ERROR BITS
ICPBEG: ; Tovar says this is the right thing to do - MRC
PJOB REG2, ; GET JOB #
MOVSS REG4,REG2 ; RECEIVE SOCKET
ADDI REG4,1 ; TRANSMIT SOCKET
MOVEI REG1,13 ; SAIL'S HOST ADDRESS NUMBER
MOVEM REG1,LHOST ; SAVE IT AWAY
INIT DCCHAN,17
SIXBIT /IMP/
0
JRST ICPLUZ
SETZM CONECB
MOVEM REG2,CONECB+LSLOC
MOVEI REG3,DCHOST
MOVEM REG3,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI REG3,40
MOVEM REG3,CONECB+BSLOC
MOVEI REG3,DCSOKT
MOVEM REG3,CONECB+FSLOC
MTAPE DCCHAN,[
↑D15
BYTE (6) 2,24,0,12,12
] ; TIME OUT CLS, RFNM, RFC, AND INPUT
MTAPE DCCHAN,CONECB
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; NO CONNECTION TO LOGGER
INPUT DCCHAN,[IOWD 1,FRS#
0]
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
MOVE REG3,FRS
LSH REG3,-4
MOVEM REG3,FRS
ADDI REG3,1
MOVEM REG3,FSS#
ADDI REG2,2
MOVEM REG2,LRS#
ADDI REG4,2
MOVEM REG4,LSS#
MOVE REG1,CONECB+LSLOC
MOVEM REG1,TERBLK+LSLOC
MTAPE DCCHAN,TERBLK ; RELEASE LOGGER
INIT DCCHAN,1
SIXBIT /IMP/
XWD DCOBUF,DCIBUF
JRST ICPLUZ
MTAPE DCCHAN,[
↑D15
BYTE (6) 5,24,0,12,0
] ; TIME OUT CLS, RFNM, AND RFC
MOVEI REG1,↑D8
DPB REG1,[POINT 6,DCIBUF+1,11]
DPB REG1,[POINT 6,DCOBUF+1,11]
MOVEM REG2,CONECB+LSLOC
MOVEI REG3,DCHOST
MOVEM REG3,CONECB+HLOC
SETZM CONECB+WFLOC
MOVEI REG3,↑D8
MOVEM REG3,CONECB+BSLOC
MOVE REG3,FSS
MOVEM REG3,CONECB+FSLOC
MTAPE DCCHAN,CONECB
MOVE REG1,CONECB+STLOC
TRNN REG1,-1
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; CAN'T CONNECT TO RECEIVE SIDE
CALLR CLSCHK ; SEE IF WE ARE REALLY OPEN
JRST ICPLUZ
AOS CONECB+LSLOC
SOS CONECB+FSLOC
MOVEI REG3,↑D8
MOVEM REG3,CONECB+BSLOC
MTAPE DCCHAN,CONECB
MOVE REG1,CONECB+STLOC
TRNN REG1,-1
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; CAN'T CONNECT TO SEND SIDE
CALLR CLSCHK
JRST ICPLUZ
MOVEI REG3,4
MOVEM REG3,CONECB
MTAPE DCCHAN,CONECB
MOVE REG1,CONECB+STLOC
TLC REG1,300000
TLCN REG1,300000
TLNE REG1,060000
JRST ICPLUZ
STATZ DCCHAN,ERRBTS
JRST ICPLUZ
SOS CONECB+LSLOC
CALLR CLSCHK
JRST ICPLUZ
MTAPE DCCHAN,CONECB
MOVE REG1,CONECB+STLOC
TLC REG1,300000
TLCN REG1,300000
TLNE REG1,060000
JRST ICPLUZ
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
CALLR CLSCHK
JRST ICPLUZ
RETURN
; HERE WHEN CONNECTION FAILS
ICPLUZ: OUTSTR [ASCIZ/? Cannot establish network connection/]
EXIT
>
; (((↑↑↑)))
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: MOVEI IOREG,"Z"-100
IDPB IOREG,DCOBUF+1
OUT DCCHAN,
JRST .+1
QUIT01: INPUT DCCHAN,
STATZ DCCHAN,20000
JRST QUIT02
SKIPE FLAGDD
CALLR NUTDD
JRST QUIT01
QUIT02: RELEAS DCCHAN, ; RELEASE INPUT/OUTPUT DEVICE
QUIT03: IFE F.SAIL,<
MOVE IOREG,COUT ; CLOSE OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEOC
>
QUIT04: IFE F.SAIL,<
MOVE IOREG,CINP ; CLOSE INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEIC
>
EXIT
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
IFN F.SAIL,<
OPEN DDCHAN,DDCHAS
JRST NETOI2
SETZM CONECB
MOVE REG1,LRS
ADDI REG1,2
MOVEM REG1,CONECB+LSLOC
MOVEI REG1,DCHOST
MOVEM REG1,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI REG1,↑D36
MOVEM REG1,CONECB+BSLOC
MOVE REG1,FSS
ADDI REG1,2
MOVEM REG1,CONECB+FSLOC
MTAPE DDCHAN,CONECB
STATZ DDCHAN,ERRBTS
JRST NETOI2
RETURN SKIP,1
>
IFE F.SAIL,<
SETZM DCDBLK+.IBDEV
MOVEI REG1,104
MOVEM REG1,DCDBLK+.IBLCL
MOVE REG1,DCIBLK+.IBRMT
ADDI REG1,2
MOVEM REG1,DCDBLK+.IBRMT
MOVE REG1,ODAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOI2
MOVE REG1,DCDBLK+.IBDEV
MOVEM REG1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOI1
RETURN SKIP,1
NETOI1: MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOI2
>
NETOI2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
IFN F.SAIL,<
OPEN DDCHAN,DDCHAS
JRST NETOO2
SETZM CONECB
MOVE REG1,LSS
ADDI REG1,2
MOVEM REG1,CONECB+LSLOC
MOVEI REG1,DCHOST
MOVEM REG1,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI REG1,↑D36
MOVEM REG1,CONECB+BSLOC
MOVE REG1,FRS
ADDI REG1,2
MOVEM REG1,CONECB+FSLOC
MTAPE DDCHAN,CONECB
STATZ DDCHAN,ERRBTS
JRST NETOO2
RETURN SKIP,1
>
IFE F.SAIL,<
SETZM DCDBLK+.IBDEV
MOVEI REG1,105
MOVEM REG1,DCDBLK+.IBLCL
MOVE REG1,DCOBLK+.IBRMT
ADDI REG1,2
MOVEM REG1,DCDBLK+.IBRMT
MOVE REG1,ODAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOO2
MOVE REG1,DCDBLK+.IBDEV
MOVEM REG1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOO1
RETURN SKIP,1
NETOO1: MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOO2
>
NETOO2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
RELEAS DDCHAN,
IFE F.SAIL,<
MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETC1
RETURN
NETC1: TTCALL 3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
; OUT: UTIL
;
NETDSI: BEGINR
IFN F.SAIL,<MOVE UTIL,LRS
ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,104>
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
; OUT: UTIL
;
NETDSO: BEGINR
IFN F.SAIL,<MOVE UTIL,LSS
ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,105>
ENDR
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI: BEGINR
SETO REG1,
CAMN REG1,FSBUF
JRST NETFI0
CAMN REG1,ESBUF
JRST NETFI0
JRST NETFI1
NETFI0: TTCALL 3,[ASCIZ/ (/]
TTCALL 3,LUTDSF
TTCALL 3,[ASCIZ/)
/]
NETFI1: SKIPN GBUF1
JRST NETFI2
MOVE REG1,[point 6,LFILE]
MOVEI REG2,6
MOVE REG3,[point 7,FBUF]
ILDB REG4,REG1
SKIPE REG4
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,.-4
NETFI2: SKIPN GBUF2
RETURN
MOVE REG1,[point 6,LFILE+1]
MOVEI REG2,3
MOVE REG3,[point 7,EBUF]
ILDB REG4,REG1
SKIPE REG4
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,.-4
ENDR
; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI: BEGINR
IN DCCHAN,
JRST .+2
JRST NETEIT
SKIPE FLAGDD
CALLR NUTDD
ENDR
; NETWORK UTILITY -- MESSAGE OUTPUT
; IN: REG1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO: BEGINR <IOREG,BPREG>
SKIPE FLAGDD
OUTSTR (REG1)
MOVEI BPREG,(REG1)
HRLI BPREG,(point 7,)
NUTMOL: ILDB IOREG,BPREG
JUMPE IOREG,RETN(0)
SKIPE DCOBUF+2
JRST NUTMOB
NUTMOO: OUT DCCHAN,
JRST .+2
JRST NETEOT
NUTMOB: SOS DCOBUF+2
IDPB IOREG,DCOBUF+1
JRST NUTMOL
ENDR
; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD: BEGINR <IOREG,UTIL>
MOVE REG1,DCIBUF+1
MOVE UTIL,DCIBUF+2
NUTDDL: SOJL UTIL,RETN(0)
ILDB IOREG,REG1
JUMPE IOREG,NUTDDL
TTCALL 1,IOREG
JRST NUTDDL
ENDR
; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
; IN: IOREG -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB: BEGINR
HLRE REG1,IOREG
SKIPGE REG1
MOVN REG1,REG1
HRRZI REG2,(IOREG)
SKIPE DDIBUF+2
JRST NUTFB2
NUTFB1: IN DDCHAN,
JRST NUTFB2
SKIPL IOREG
THUD
STATO DDCHAN,020000
THUD
RETURN
NUTFB2: HRRZ REG3,DDIBUF+1
HRLI REG2,1(REG3)
MOVEI REG3,(REG1)
CAMLE REG3,DDIBUF+2
MOVE REG3,DDIBUF+2
ADDI REG3,-1(REG2)
BLT REG2,(REG3)
CAMG REG1,DDIBUF+2
JRST NUTFB3
SUB REG1,DDIBUF+2
MOVEI REG2,1(REG3)
JRST NUTFB1
NUTFB3: ADDM REG1,DDIBUF+1
MOVE REG2,DDIBUF+2
SUBI REG2,(REG1)
MOVEM REG2,DDIBUF+2
SKIPL IOREG
RETURN
ENDR SKIP,1
; FATAL NETWORK ERROR MESSAGES
;
; (((NOT SAIL)))
IFE F.SAIL,<
ICPERD: TTCALL 3,[ASCIZ / ?? Restart failure ??/]
EXIT
ICPEIL: TTCALL 3,[ASCIZ / ?? Input socket listen failure ??/]
EXIT
ICPEOL: TTCALL 3,[ASCIZ / ?? Output socket listen failure ??/]
JRST QUIT04
ICPET: TTCALL 3,[ASCIZ / ?? ICP failure (transfer) ??/]
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
ICPEZ: MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
JRST QUIT03
ICPEF: TTCALL 3,[ASCIZ / ?? ICP failure (file control) ??/]
JRST ICPEZ
ICPEC: TTCALL 3,[ASCIZ / The datacomputer is unavailable/]
MOVE 0,ICPBLK+.IBERR
CAIN 0,.IESOF ; SOCKET OPEN FAILURE
TTCALL 3,[ASCIZ / (rejecting)/]
CAIN 0,.IEDWN
TTCALL 3,[ASCIZ / (down)/]
CAIN 0,.IETIM
TTCALL 3,[ASCIZ / (timeout)/]
TTCALL 3,[ASCIZ /.
/]
MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/]
JRST QUIT03
JRST QUIT03
NETEIC: TTCALL 3,[ASCIZ / ?? Input failure (connection) ??/]
EXIT
NETEOC: TTCALL 3,[ASCIZ / ?? Output failure (connection) ??/]
JRST QUIT04
NETECF: TTCALL 3,[ASCIZ / ?? File control failure ??/]
JRST QUIT03
>
; (((↑↑↑)))
NETEIT: TTCALL 3,[ASCIZ / ?? Input failure (transfer) ??/]
JRST QUIT
NETEOT: TTCALL 3,[ASCIZ / ?? Output failure (transfer) ??/]
JRST QUIT
; (((SAIL)))
IFE F.SAIL,<
OICP: .IUCON,,ICPBLK
CICP: .IUCLS,,ICPBLK
LINP: .IULSN,,DCIBLK
OINP: .IUCON,,DCIBLK
CINP: .IUCLS,,DCIBLK
LOUT: .IULSN,,DCOBLK
OOUT: .IUCON,,DCOBLK
COUT: .IUCLS,,DCOBLK
ODAT: 001000+.IUCON,,DCDBLK ; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT: .IUCLS,,DCDBLK
PWRK: .IULHS,,WRKBLK
SWRK: .IUSTT,,WRKBLK
CWRK: .IUCLS,,WRKBLK
>
; (((↑↑↑)))
;(((SAIL)))
IFN F.SAIL,<
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME
CLSCHK: BEGINR
MTAPE DCCHAN,STTBLK
MOVE REG1,STTBLK+1
IOR REG1,STTBLK+2
STATO DCCHAN,ERRBTS
TLNN REG1,060000
RETURN SKIP,1
ENDR
>
;(((↑↑↑↑)))
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOI1
SETZM LFILE+3 ; JUST GUESS WHAT A NEGATIVE NUMBER
; WITH SIZE DOES ON SAIL WITH SIXBIT
; PPN'S!!!(YOU GUESSED IT...)
LOOKUP LFCHAN,LFILE ; PREPARE FILE FOR INPUT
JRST LOCOI2
RETURN SKIP,1
LOCOI1: TTCALL 3,[ASCIZ / ?? Local channel OPEN failure ??
/]
RELEAS LFCHAN,
RETURN
LOCOI2: TTCALL 3,[ASCIZ / (Local file not found.)
/]
RELEAS LFCHAN,
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR <IOREG,<IOREG+1>>
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS
JRST LOCOO2
MOVE IOREG,<LFILE+1>
MOVE <IOREG+1>,<LFILE+2>
SETZM LFILE+3
LOOKUP LFCHAN,LFILE
JRST LOCOO1
TAIN <[ASCIZ / [Old Local File][Confirm]/]>
JRST .+3
JRST .+2
JRST LOCOO1
RELEAS LFCHAN,
RETURN
LOCOO1: RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOO2
MOVEM IOREG,<LFILE+1>
MOVEM <IOREG+1>,<LFILE+2>
SETZM LFILE+3
ENTER LFCHAN,LFILE ; PREPARE FILE FOR OUTPUT
JRST LOCOO2
RETURN SKIP,1
LOCOO2: TTCALL 3,[ASCIZ / ?? Local file creation failure ??
/]
RELEAS LFCHAN,
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
RELEAS LFCHAN,
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: IOREG -- SIZE IN WORDS
;
LOCS: BEGINR
SKIPL LFILE+3
JRST LOCS1
HLRO IOREG,LFILE+3 ; SIZE IN WORDS
MOVN IOREG,IOREG
RETURN
LOCS1: HLRZ IOREG,LFILE+3 ; SIZE IN BLOCKS
IMULI IOREG,SIZBLK
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR <IOREG>
SETZM GBUF1
LDB REG1,[350700,,FBUF]
CAIN REG1,"*"
SETOM GBUF1
SETZM GBUF2
LDB REG1,[350700,,EBUF]
CAIN REG1,"*"
SETOM GBUF2
SETO REG1,
CAMN REG1,FSBUF
JRST LOCFI0
CAMN REG1,ESBUF
JRST LOCFI0
JRST LOCFI5
LOCFI0: SETZM LUTDSP
LOCFI1: CALLR LUTDS
JRST .+2
JRST .+3
TTCALL 3,[ASCIZ/ (No Such File)
/]
RETURN
SETO REG1,
CAME REG1,FSBUF
JRST LOCFI2
CAME REG1,ESBUF
JRST LOCFI3
JRST LOCFI4
LOCFI2: MOVE REG1,[point 7,FSBUF]
MOVE REG2,[point 7,LUTDSF]
ILDB REG3,REG1
ILDB REG4,REG2
JUMPE REG3,.+4
CAIN REG3,(REG4)
JRST .-4
JRST LOCFI1
JUMPE REG4,LOCFI4
CAIN REG4,"."
JRST LOCFI4
JRST LOCFI1
LOCFI3: MOVE REG1,[point 7,ESBUF]
MOVE REG2,[point 7,LUTDSF]
ILDB REG4,REG2
JUMPE REG4,.+4
CAIE REG4,"."
JRST .-3
ILDB REG4,REG2
ILDB REG3,REG1
JUMPE REG3,.+4
CAIN REG3,(REG4)
JRST .-4
JRST LOCFI1
JUMPE REG4,LOCFI4
JRST LOCFI1
LOCFI4: HRRZI IOREG,LUTDSF
CALLR LUTFN
LOCFI5: CALLR LOCOI
RETURN
CALLR LOCC
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR <IOREG>
CALLR LOCC
SETO REG1,
CAMN REG1,FSBUF
JRST LOCNI0
CAMN REG1,ESBUF
JRST LOCNI0
RETURN SKIP,1
LOCNI0: CALLR LUTDS
RETURN SKIP,1
SETO REG1,
CAME REG1,FSBUF
JRST LOCNI1
CAME REG1,ESBUF
JRST LOCNI2
JRST LOCNI3
LOCNI1: MOVE REG1,[point 7,FSBUF]
MOVE REG2,[point 7,LUTDSF]
ILDB REG3,REG1
ILDB REG4,REG2
JUMPE REG3,.+4
CAIN REG3,(REG4)
JRST .-4
JRST LOCNI0
JUMPE REG4,LOCNI3
CAIN REG4,"."
JRST LOCNI3
JRST LOCNI0
LOCNI2: MOVE REG1,[point 7,ESBUF]
MOVE REG2,[point 7,LUTDSF]
ILDB REG4,REG2
JUMPE REG4,.+4
CAIE REG4,"."
JRST .-3
ILDB REG4,REG2
ILDB REG3,REG1
JUMPE REG3,.+4
CAIN REG3,(REG4)
JRST .-4
JRST LOCNI0
JUMPE REG4,LOCNI3
JRST LOCNI0
LOCNI3: HRRZI IOREG,LUTDSF
CALLR LUTFN
CALLR LOCOI
JRST LOCNI0
TTCALL 3,[ASCIZ/ (/]
TTCALL 3,LUTDSF
TTCALL 3,[ASCIZ/)
/]
SKIPN GBUF1
JRST LOCNI4
MOVE REG1,[point 6,LFILE]
MOVEI REG2,6
MOVE REG3,[point 7,FBUF]
ILDB REG4,REG1
SKIPE REG4
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,.-4
LOCNI4: SKIPN GBUF2
RETURN
MOVE REG1,[point 6,LFILE+1]
MOVEI REG2,3
MOVE REG3,[point 7,EBUF]
ILDB REG4,REG1
SKIPE REG4
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,.-4
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR <IOREG>
SETZ REG1,
SETO REG2,
CAMN REG2,FSBUF
TRO REG1,400000
CAMN REG2,ESBUF
TRO REG1,200000
JUMPE REG1,RETN(0)
MOVE REG2,[point 7,ABUF]
MOVE REG3,[point 7,FSBUF]
TRNE REG1,400000
HRRI REG3,FBUF
ILDB REG4,REG3
CAIN REG4," "
SETZ REG4,
IDPB REG4,REG2
JUMPN REG4,.-4
SKIPN ESBUF
JRST LOCNO0
MOVEI REG4,"."
DPB REG4,REG2
MOVE REG3,[point 7,ESBUF]
TRNE REG1,200000
HRRI REG3,EBUF
ILDB REG4,REG3
CAIN REG4," "
SETZ REG4,
IDPB REG4,REG2
JUMPN REG4,.-4
LOCNO0: MOVEI IOREG,ABUF
CALLR LUTFN
TTCALL 3,[ASCIZ/ (/]
TTCALL 3,ABUF
TTCALL 3,[ASCIZ/)
/]
ENDR
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IOREG,BPREG,UTIL>
HRRI BPREG,(IOREG)
HRLI BPREG,(point 7,)
SETZM LFILE ; CLEAR OLD FILE NAME
SETZM LFILE+1 ; AND EXTENSION
SETZM LFILE+2
SETZM LFILE+3
MOVEI REG1,LUTFNT ; INITIALIZE XCT PNTR
MOVEI REG2,LFILE ; SET DESTINATION OF IOR
SETZ UTIL,
LUTFN1: ILDB IOREG,BPREG
JUMPE IOREG,RETN(0)
CAIN IOREG,"." ; PREPARE FOR FILE EXTENSION IF "."
JRST LUTFN2
CAILE UTIL,5
JRST LUTFN1
ADDI IOREG,40 ; CONVERT TO SIXBIT BY ADDITION
ANDI IOREG,77 ; AND REMOVAL OF HIGH BITS
XCT (REG1) ; EXECUTE THE PROPER ROTATE
IORM IOREG,(REG2) ; IOR RESULT INTO FILE OR FILE+1
AOJ REG1, ; INCREMENT THE XCT PNTR
AOJA UTIL,LUTFN1
LUTFN2: CAIN REG2,LFILE+1
JRST RETN(0) ; IGNORE MULTIPLE EXTENSIONS
MOVEI REG1,LUTFNT ; RESET PNTRS FOR EXTENSION
MOVEI REG2,LFILE+1
MOVEI UTIL,3
JRST LUTFN1
LUTFNT: ROT IOREG,-6 ; HIGH ORDER
ROT IOREG,-14
ROT IOREG,22
ROT IOREG,14
ROT IOREG,6
ROT IOREG,0 ; LOW ORDER
ENDR
; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS: BEGINR
SKIPN LUTDSP
JRST LUTDSS
LUTDS1: JSP REG1,LUTDSI
JUMPE REG2,[ JSP REG1,LUTDSI
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP REG1,LUTDSI>
>
; (((↑↑↑)))
JRST LUTDS1] ; IGNORE HOLES IN DIRECTORY
MOVE REG3,[POINT 7,LUTDSF]
LUTDS2: SETZ REG1,
LSHC REG1,6
ADDI REG1," "
IDPB REG1,REG3
JUMPN REG2,LUTDS2
MOVEI REG1,"."
IDPB REG1,REG3
JSP REG1,LUTDSI
ANDCMI REG2,-1
LUTDS3: SETZ REG1,
LSHC REG1,6
ADDI REG1," "
IDPB REG1,REG3
JUMPN REG2,LUTDS3
SETZ REG1,
IDPB REG1,REG3
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP REG1,LUTDSI> ;IGNORE EXTRA SAIL UFD CRUFT
>
; (((↑↑↑)))
RETURN SKIP,1
LUTDSI: SOSG LDIBUF+2
IN LDCHAN,
CAIA
JRST LUTDSD
ILDB REG2,LDIBUF+1
JRST (REG1)
LUTDSS: RELEAS LDCHAN,
GETPPN REG1,
MOVEM REG1,LDIR
MOVE REG1,[SIXBIT/UFD/]
MOVEM REG1,LDIR+1
SETZM LDIR+2
IFE F.SAIL,<MOVE REG1,[1,,1]>
IFN F.SAIL,<MOVE REG1,[SIXBIT/ 1 1/]>
MOVEM REG1,LDIR+3
OPEN LDCHAN,LDCHAS
JRST LUTDSE
LOOKUP LDCHAN,LDIR
JRST LUTDSE
SETOM LUTDSP
JRST LUTDS1
LUTDSD: STATO LDCHAN,20000
LUTDSE: TTCALL 3,[ASCIZ/ ?? LOCAL DIRECTORY FAILURE ??
/]
RELEAS LDCHAN,
ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
; IN: IOREG -- DATE INTEGER
; UTIL -- TIME INTEGER
; BPREG -- BYTE POINTER TO DESTINATION STRING
; OUT: BPREG -- UPDATED BYTE POINTER
;
LUTTNS: BEGINR
MOVE REG1,IOREG
IDIVI REG1,↑D31
MOVEI REG3,(REG1)
MOVEI REG1,1(REG2)
IDIVI REG1,↑D10
ADDI REG1,"0"
ADDI REG2,"0"
IDPB REG1,BPREG
IDPB REG2,BPREG
MOVEI REG1,"-"
IDPB REG1,BPREG
MOVEI REG1,(REG3)
IDIVI REG1,↑D12
MOVEI REG3,(REG1)
HRRI REG1,LUTTM(REG2)
HRLI REG1,(point 7,)
SCOPY (REG1,BPREG)
MOVEI REG1,"-"
IDPB REG1,BPREG
MOVEI REG1,↑D64(REG3)
IDIVI REG1,↑D10
ADDI REG1,"0"
ADDI REG2,"0"
IDPB REG1,BPREG
IDPB REG2,BPREG
MOVEI REG1," "
IDPB REG1,BPREG
MOVE REG1,UTIL
IDIVI REG1,↑D60
MOVEI REG3,(REG2)
IDIVI REG1,↑D10
ADDI REG1,"0"
ADDI REG2,"0"
IDPB REG1,BPREG
IDPB REG2,BPREG
MOVEI REG1,":"
IDPB REG1,BPREG
MOVEI REG1,(REG3)
IDIVI REG1,↑D10
ADDI REG1,"0"
ADDI REG2,"0"
IDPB REG1,BPREG
IDPB REG2,BPREG
SETZ REG1,
IDPB REG1,BPREG
ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
; IN: IOREG -- ADDRESS OF TIME STRING
; OUT: IOREG -- DATE INTEGER
; UTIL -- TIME INTEGER
;
LUTTSN: BEGINR <BPREG>
MOVE BPREG,IOREG
SETZ IOREG,
SETZ UTIL,
ILDB REG1,BPREG
CAIL REG1,"0"
CAILE REG1,"9"
RETURN
MOVEI REG4,-"0"(REG1)
IMULI REG4,↑D10
ILDB REG1,BPREG
ADDI REG4,-"0"(REG1)
ILDB REG1,BPREG
CAIE REG1,"-"
RETURN
MOVE REG3,[point 7,REG2]
SETZ REG2,
ILDB REG1,BPREG
IDPB REG1,REG3
ILDB REG1,BPREG
IDPB REG1,REG3
ILDB REG1,BPREG
IDPB REG1,REG3
MOVEI REG3,↑D11
CAMN REG2,LUTTM(REG3)
JRST .+3
SOJGE REG3,.-2
RETURN
ILDB REG1,BPREG
CAIE REG1,"-"
RETURN
ILDB REG1,BPREG
MOVEI REG2,-"0"(REG1)
IMULI REG2,↑D10
ILDB REG1,BPREG
ADDI REG2,-"0"(REG1)
SUBI REG2,↑D64
IMULI REG2,↑D12
ADDI REG2,(REG3)
IMULI REG2,↑D31
ADDI REG2,-1(REG4)
ILDB REG1,BPREG
CAIE REG1," "
RETURN
ILDB REG1,BPREG
MOVEI REG3,-"0"(REG1)
IMULI REG3,↑D10
ILDB REG1,BPREG
ADDI REG3,-"0"(REG1)
IMULI REG3,6
ILDB REG1,BPREG
CAIE REG1,":"
RETURN
ILDB REG1,BPREG
ADDI REG3,-"0"(REG1)
IMULI REG3,↑D10
ILDB REG1,BPREG
ADDI REG3,-"0"(REG1)
MOVE IOREG,REG2
MOVE UTIL,REG3
ENDR
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM: ASCII /JAN/
ASCII /FEB/
ASCII /MAR/
ASCII /APR/
ASCII /MAY/
ASCII /JUN/
ASCII /JUL/
ASCII /AUG/
ASCII /SEP/
ASCII /OCT/
ASCII /NOV/
ASCII /DEC/
; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS: MOVE IOREG,[IN DDCHAN,]
CAMN IOREG,-3(FLAG)
JRST IOERDD
MOVE IOREG,[OUT DDCHAN,]
CAMN IOREG,-3(FLAG)
JRST IOERDD
MOVE IOREG,[IN LFCHAN,]
CAMN IOREG,-3(FLAG)
JRST IOERLF
MOVE IOREG,[OUT LFCHAN,]
CAMN IOREG,-3(FLAG)
JRST IOERLF
TTCALL 3,[ASCIZ/ ?? Impossible event at /]
MOVEI IOREG,-1(FLAG)
TNOUT (IOREG,10)
TTCALL 3,[ASCIZ / ??/]
EXIT
IOERDD: GETSTS DDCHAN,ABUF
JRST .+2
IOERLF: GETSTS LFCHAN,ABUF
TTCALL 3,[ASCIZ/ ?? Data error at /]
MOVEI IOREG,-3(FLAG)
TNOUT (IOREG,10)
TTCALL 3,[ASCIZ/ with status /]
MOVE IOREG,ABUF
TNOUT (IOREG,10)
TTCALL 3,[ASCIZ / ??
/]
SETOM FLAGDE
CALLR RENDER
JRST QUIT
JRST QUIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE REG1,[SIXBIT/DFTP/]
SETNM
HRRZI REG1,-1
RFMOD
TRZ REG2,006000 ; (1B24+1B25)
SFMOD
MOVE REG2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
MOVE REG3,[252525,,253000] ; AND EOL'S (NO NULLS)
SFCOC
MOVEI REG1,400000 ; FOR THIS FORK
MOVE REG2,[LEVTAB,,CHNTAB]
SIR ; SET UP INTERRUPT TABLES
EIR ; ENABLE INTERRUPTS
MOVE REG1,[17,,0] ; ↑O ON CHANNEL 0
ATI
MOVEI REG1,400000 ; FOR THIS FORK
MOVE REG2,[1B0+1B10+1B15] ; TTY, EOF, ILI
AIC ; ACTIVATE CHANNELS
SETZM FLAGCO
SETZM FLAGEF
CALLR ICP
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <BPREG,UTIL>
MOVEI REG1,400000
RUNTM
IDIV REG3,REG2
MOVEM REG3,NTIME
MOVE REG1,DCDJFN
MOVE REG2,[444400,,FBUF]
MOVNI REG3,GET$F
SETOM FLAGEF
SIN
SKIPN FLAGEF
RETURN
SETZM FLAGEF
MOVEI BPREG,GET$F
MOVEM BPREG,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(BPREG)
SOJG BPREG,.-1
ADDM UTIL,NSUM
MOVE REG1,DCDJFN
MOVE REG2,[444400,,EBUF]
MOVNI REG3,GET$E
SIN
MOVEI BPREG,GET$E
ADDM BPREG,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(BPREG)
SOJG BPREG,.-1
ADDM UTIL,NSUM
MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,GET$D
SIN
MOVEI BPREG,GET$D
ADDM BPREG,NSIZE
SETZ UTIL,
ADD UTIL,<PAGE-1>(BPREG)
SOJG BPREG,.-1
ADDM UTIL,NSUM
MOVE REG1,[point 7,PAGE]
SETZ REG2,
IDTIM
SETZ REG2,
MOVEM REG2,ABUF
MOVE REG1,DCDJFN
BIN
AOS NSIZE
ADDM REG2,NSUM
MOVEM REG2,<ABUF+1>
BIN
AOS NSIZE
ADDM REG2,NSUM
MOVEM REG2,<ABUF+2>
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT: BEGINR <IOREG,BPREG,UTIL>
SETZ UTIL,
MOVE REG1,DCDJFN
BIN
JUMPE REG2,GETD2
ADDM REG2,NSUM
MOVN IOREG,REG2
ADDI REG2,3
ADDM REG2,NSIZE
GETD1: MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SIN
HRRZ REG1,LJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SOUT
MOVN BPREG,IOREG
CAILE BPREG,SIZPAG
MOVEI BPREG,SIZPAG
ADD UTIL,<PAGE-1>(BPREG)
SOJG BPREG,.-1
ADDI IOREG,SIZPAG
JUMPL IOREG,GETD1
GETD2: MOVE REG1,DCDJFN
BIN
ADD UTIL,REG2
ADDM UTIL,NSUM
BIN
ADDM REG2,NSUM
CAMN REG2,UTIL
JRST GETD3
TSOUT <[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD3: HRROI REG1,LFILE
HRRZ REG2,LJFN
MOVE REG3,[022220,,000001]
JFNS
CALLR LOCC
SETO REG1,
CAMN REG1,FSBUF
JRST GETD4
CAMN REG1,ESBUF
JRST GETD4
CAMN REG1,VSBUF
JRST GETD4
JRST GETD5
GETD4: HRROI REG1,[ASCIZ/ /]
PSOUT
HRROI REG1,LFILE
PSOUT
HRROI REG1,CRLF
PSOUT
GETD5: CALLR LOCOI
THUD
MOVE REG3,<ABUF+2>
JUMPLE REG3,GETD6
HRR REG1,LJFN
HRLI REG1,11 ; OFFSET 11
HRLZI REG2,007700 ; BYTESIZE (B6-B11)
LSH REG3,30
CHFDB
HRR REG1,LJFN
HRLI REG1,12 ; OFFSET 12 (BYTE COUNT)
SETO REG2,
MOVE REG3,<ABUF+1>
CHFDB
GETD6: SKIPN ABUF
JRST GETD7
MOVEI REG1,400000
RPCAP
TRNN REG2,600000 ; (1B18+1B19) WHEEL OR OPER
JRST GETD7
MOVE UTIL,REG3
TRO REG3,(REG2)
EPCAP ; ENABLE (!)
HRR REG1,LJFN
HRLI REG1,14 ; OFFSET 14 (LAST WRITE)
SETO REG2,
MOVE REG3,ABUF
CHFDB
MOVEI REG1,400000
MOVE REG3,UTIL
EPCAP ; RESET CAPABILITIES
GETD7: MOVEI REG1,400000
RUNTM
IDIV REG3,REG2
MOVE REG2,NTIME
SUB REG3,REG2
MOVEM REG3,NTIME
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <BPREG,UTIL>
MOVEI REG1,400000
RUNTM
IDIV REG3,REG2
MOVEM REG3,NTIME
MOVE BPREG,[point 7,PAGE]
MOVE UTIL,[point 7,FBUF]
SCOPY (UTIL,BPREG)
MOVE BPREG,UTIL
MOVE UTIL,[point 7,EBUF]
SCOPY (UTIL,BPREG)
MOVE BPREG,UTIL
HRRZ REG1,LJFN
MOVE REG2,[1,,14] ; 1 WORD, OFFSET 14 (LAST WRITE)
HRRZI REG3,UBUF1
GTFDB
JRST PUTF1
SETZ REG1,
IDPB REG1,BPREG
JRST PUTF2
PUTF1: MOVE REG1,BPREG
MOVE REG2,UBUF1
SETZ REG3,
ODTIM
IBP REG1
MOVE BPREG,REG1
PUTF2: GTAD
MOVE REG2,REG1
MOVE REG1,BPREG
ODTIM
IBP REG1
MOVEI BPREG,(REG1)
MOVE UTIL,VBUF
MOVEM UTIL,1(BPREG)
ADDI BPREG,1
HRRZ REG1,LJFN
MOVE REG2,[2,,11] ; 2 WORDS, OFFSET 11 (BYTESIZE & COUNT)
HRRZI REG3,UBUF1
GTFDB
JRST PUTF3
SETZM UBUF1
SETZM <UBUF1+1>
PUTF3: MOVE UTIL,<UBUF1+1>
MOVEM UTIL,1(BPREG)
LDB UTIL,[300600,,UBUF1]
MOVEM UTIL,2(BPREG)
ADDI BPREG,2
MOVEI UTIL,1(BPREG)
SUBI UTIL,PAGE
MOVEM UTIL,NSIZE
MOVEI BPREG,-1(UTIL)
SETZ UTIL,
ADD UTIL,PAGE(BPREG)
SOJGE BPREG,.-1
ADDM UTIL,NSUM
MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVN REG3,NSIZE
SOUT
ENDR
; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT: BEGINR <IOREG,BPREG,UTIL>
CALLR LOCS
MOVE REG1,DCDJFN
MOVE REG2,IOREG
BOUT
ADDM REG2,NSUM
ADDI REG2,2
ADDM REG2,NSIZE
MOVN IOREG,IOREG
SETZ UTIL,
PUTD1: HRRZ REG1,LJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SIN
MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SOUT
MOVN BPREG,IOREG
CAILE BPREG,SIZPAG
MOVEI BPREG,SIZPAG
ADD UTIL,<PAGE-1>(BPREG)
SOJG BPREG,.-1
ADDI IOREG,SIZPAG
JUMPL IOREG,PUTD1
MOVE REG1,DCDJFN
MOVE REG2,UTIL
BOUT
ADDM UTIL,NSUM
ADDM UTIL,NSUM
MOVEI REG2,21
MTOPR
MOVEI REG1,400000
RUNTM
IDIV REG3,REG2
MOVE REG2,NTIME
SUB REG3,REG2
MOVEM REG3,NTIME
ENDR
; TENEX ICP: 1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 2) OPEN CONNECTION SOCKETS
; A) EVEN - INPUT
; B) ODD - OUTPUT
; JFN STRING: "NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP: BEGINR
MOVE REG1,[point 7,UBUF1]
HRROI REG2,[ASCIZ/NET:20./]
SETZ REG3,
SOUT ; LOCAL SOCKET 20+JOBREL
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT ; FAILURE -- MAKE HOST # INTO STRING
JRST .+1 ; CVHST SUCCESS OR NOUT FAILURE
MOVN REG2,DCSOCK
NOUT
JRST .+1
HRLZI REG1,1 ; SHORT GTJFN
HRROI REG2,UBUF1
GTJFN ; ICP CONNECTION
JRST ICPEG
MOVE REG2,[40B5+1B19] ; 32-BIT, READ
OPENF ; OPEN ICP CONNECTION
JRST ICPEO
BIN
MOVEM REG2,ICPSOC
CLOSF
JRST ICPEC
MOVE REG1,[point 7,UBUF1]
HRROI REG2,[ASCIZ/NET:22./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN ; OUTPUT JFN
JRST ICPEIG
MOVEM REG1,DCOJFN
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN ; INPUT JFN
JRST ICPEOG
MOVEM REG1,DCIJFN
MOVE REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
OPENF
JRST ICPEIO
MOVE REG1,DCOJFN
MOVE REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST ICPEOO
MOVE REG1,[SIXBIT/LHOSTN/]
SYSGT
MOVEM REG1,LHOST
ENDR
; NETWORK QUIT
;
QUIT: MOVE REG1,DCOJFN
MOVEI REG2,"Z"-100
BOUT
MOVEI REG2,21
MTOPR
SETOM FLAGEF
QUIT01: DCBIN <IOREG>
SKIPE FLAGEF
JRST QUIT01
RESET
HALTF
JRST .-1 ; IN CASE OF "CONTINUE"
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
MOVE REG1,[point 7,UBUF1]
HRROI REG2,[ASCIZ/NET:24./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
SUBI REG2,3
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN
JRST NETOI2
MOVEM REG1,DCDJFN
MOVE REG2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
OPENF
JRST NETOI1
RETURN SKIP,1
NETOI1: RLJFN
JRST NETOI2
NETOI2: HRROI REG1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
MOVE REG1,[point 7,UBUF1]
HRROI REG2,[ASCIZ/NET:25./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
SUBI REG2,2
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN
JRST NETOO2
MOVEM REG1,DCDJFN
MOVE REG2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST NETOO1
RETURN SKIP,1
NETOO1: RLJFN
JRST NETOO2
NETOO2: HRROI REG1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
MOVE REG1,DCDJFN
CLOSF
JRST NETC1
RETURN
NETC1: HRROI [ASCIZ/ ?? Network connection CLOSE failure ??
/]
PSOUT
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
; OUT: UTIL
;
NETDSI: BEGINR
GJINF
HRRZI UTIL,(REG2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,24
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
; OUT: UTIL
;
NETDSO: BEGINR
GJINF
HRRZI UTIL,(REG2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,25
ENDR
; NETFFI -- NETWORK FIX FIRST FILE NAME
;
NETFFI: BEGINR
MOVE REG2,LJFN
TLNN REG2,770000
JRST NETFI1
HRROI REG1,LFILE
HRRZI REG2,(REG2)
SETZ REG3,
JFNS
HRROI REG1,[ASCIZ/ /]
PSOUT
HRROI REG1,LFILE
PSOUT
HRROI REG1,CRLF
PSOUT
NETFI1: SKIPN GBUF1
JRST NETFI2
HRROI REG1,FBUF
HRRZ REG2,LJFN
HRLZI REG3,002000
JFNS
NETFI2: SKIPN GBUF2
JRST NETFI3
HRROI REG1,EBUF
HRRZ REG2,LJFN
HRLZI REG3,000200
JFNS
NETFI3: SKIPL VSBUF
RETURN
MOVN REG1,VBUF
MOVEM REG1,VSBUF
ENDR
; FATAL NETWORK ERROR MESSAGES
;
NETEQ: PSOUT
RESET
HALTF
JRST .-1
ICPEG: HRROI REG1,[ASCIZ/ The datacomputer is unavailable (network)./]
JRST NETEQ
ICPEO: HRROI REG1,[ASCIZ/ The datacomputer is unavailable (down)./]
JRST NETEQ
ICPEC: HRROI REG1,[ASCIZ/ ?? ICP CLOSF failure ??/]
JRST NETEQ
ICPEOG: HRROI REG1,[ASCIZ/ ?? ICP output GTJFN failure ??/]
JRST NETEQ
ICPEIG: HRROI REG1,[ASCIZ/ ?? ICP input GTJFN failure ??/]
JRST NETEQ
ICPEIO: HRROI REG1,[ASCIZ/ ?? ICP output OPENF failure ??/]
JRST NETEQ
ICPEOO: HRROI REG1,[ASCIZ/ ?? ICP input OPENF failure ??/]
JRST NETEQ
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
HRLZI REG1,100101 ; OLD FILE, *'S, SHORT CALL
MOVE REG2,[point 7,LFILE]
GTJFN
JRST LOCOI1
MOVEM REG1,LJFN
HRRZI REG1,(REG1)
MOVE REG2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCOI2
RETURN SKIP,1
LOCOI1: HRROI REG1,[ASCIZ/ (Local file not found.)
/]
PSOUT
RETURN
LOCOI2: HRROI REG1,[ASCIZ/ (Local file not available.)
/]
PSOUT
HRRZ REG1,LJFN
RLJFN
RETURN
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
HRLZI REG1,600001 ; VN, WRITE, SHORT
MOVE REG2,[point 7,LFILE]
GTJFN
JRST LOCOO2
MOVEM REG1,LJFN
MOVE REG2,[440000,,100000] ; 36 BIT BYTE, READ
OPENF
JRST LOCOO1
RETURN SKIP,1
LOCOO1: HRRZ REG1,LJFN
RLJFN
JRST .+1
LOCOO2: HRROI REG1,[ASCIZ/ ?? Local file creation failure ??
/]
PSOUT
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
HRRZ REG1,LJFN
CLOSF
JRST LOCC1
RETURN
LOCC1: HRROI REG1,[ASCIZ/ ?? Local file CLOSE failure ??
/]
PSOUT
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: IOREG -- SIZE IN WORDS
;
LOCS: BEGINR
HRRZ REG1,LJFN
MOVE REG2,[2,,11] ; READ 2 WORDS, OFFSET OF 11
HRRZI REG3,UBUF1
GTFDB
JRST .+3
SETZ IOREG,
RETURN
LDB REG1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
MOVEI REG2,↑D36
IDIVI REG2,(REG1) ; BYTES/WD
MOVE REG3,UBUF1+1 ; BYTE COUNT TO EOF
ADDI REG3,-1(REG2) ; ACCOUNT FOR TRUNCATION
IDIVI REG3,(REG2) ; NUMBER OF WORDS
MOVE IOREG,REG3
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR
SETZM GBUF1
LDB REG1,[350700,,FBUF]
CAIN REG1,"*"
SETOM GBUF1
SETZM GBUF2
LDB REG1,[350700,,EBUF]
CAIN REG1,"*"
SETOM GBUF2
CALLR LOCOI
RETURN
CALLR LOCC
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR
HRRZ REG1,LJFN
TLO REG1,400000
CLOSF
JRST .+1
LOCNI1: MOVE REG1,LJFN
GNJFN
RETURN SKIP,1
HRRZI REG1,(REG1)
MOVE REG2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCNI1
SKIPL VSBUF
JRST LOCNI2
MOVE REG1,[LFILE,,UBUF1]
BLT REG1,<UBUF1+SBSIZE-1>
LOCNI2: HRROI REG1,LFILE
HRRZ REG2,LJFN
SETZ REG3,
JFNS
HRROI REG1,[ASCIZ/ /]
PSOUT
HRROI REG1,LFILE
PSOUT
HRROI REG1,CRLF
PSOUT
SKIPL VSBUF
JRST LOCNI5
MOVE REG1,[440700,,LFILE]
MOVE REG2,[440700,,UBUF1]
LOCNI3: ILDB REG3,REG1
ILDB REG4,REG2
CAIE REG3,(REG4)
JRST LOCNI4
CAIE REG3,";"
JUMPN REG3,LOCNI3
AOS VBUF
JRST LOCNI5
LOCNI4: MOVN REG1,VSBUF
MOVEM REG1,VBUF
LOCNI5: SKIPN GBUF1
JRST LOCNI6
HRROI REG1,FBUF
HRRZ REG2,LJFN
HRLZI REG3,002000
JFNS
LOCNI6: SKIPN GBUF2
RETURN
HRROI REG1,EBUF
HRRZ REG2,LJFN
HRLZI REG3,000200
JFNS
RETURN
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR
SETZ REG1,
SETO REG2,
CAMN REG2,FSBUF
TRO REG1,400000
CAMN REG2,ESBUF
TRO REG1,200000
CAMN REG2,VSBUF
TRO REG1,100000
JUMPE REG1,RETN(0)
MOVE REG2,[point 7,LFILE]
MOVE REG3,[point 7,FSBUF]
TRNE REG1,400000
HRRI REG3,FBUF
ILDB REG4,REG3
CAIN REG4," "
SETZ REG4,
IDPB REG4,REG2
JUMPN REG4,.-4
SKIPN ESBUF
JRST LOCNO0
MOVEI REG4,"."
DPB REG4,REG2
MOVE REG3,[point 7,ESBUF]
TRNE REG1,200000
HRRI REG3,EBUF
ILDB REG4,REG3
CAIN REG4," "
SETZ REG4,
IDPB REG4,REG2
JUMPN REG4,.-4
LOCNO0: SKIPG VSBUF
RETURN
MOVEI REG4,";"
DPB REG4,REG2
MOVE REG1,REG2
MOVE REG2,VSBUF
MOVEI REG3,↑D10
NOUT
THUD
ENDR
; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI: SETOM FLAGCO
DEBRK
EOFPSI: SKIPN FLAGEF
JRST EOFPSE
SETZM FLAGEF
DEBRK ; RETURN FROM INTERRUPT
EOFPSE: HRROI REG1,[ASCIZ/ ?? Unexpected EOF at /]
PSOUT
MOVEI REG1,101
HRRZ REG2,PSIPC1
SUBI REG2,1
MOVEI REG3,10
SETZ REG4,
NOUT
JRST .+1
HRROI REG1,[ASCIZ/ ??
/]
PSOUT
HALTF
JRST .-1
ILIPSI: HRRZ REG1,PSIPC1
MOVE REG2,-1(REG1)
CAMN REG2,[GTFDB]
JRST ILIPSD
CAMN REG2,[CHFDB]
JRST ILIPSD
HRROI REG1,[ASCIZ/ ?? Illegal instruction at /]
CAMN REG2,[-1]
HRROI REG1,[ASCIZ/ ?? Impossible event at /]
PSOUT
MOVEI REG1,101
HRRZ REG2,PSIPC1
SUBI REG2,1
MOVEI REG3,10
SETZ REG4,
NOUT
JRST .+1
HRROI REG1,[ASCIZ/ ??
/]
PSOUT
HALTF
JRST .-1
ILIPSD: HRROI REG1,[ASCIZ/ (Bad local device.)
/]
PSOUT
AOS PSIPC1
DEBRK ; RETURN FROM INTERRUPT
>
; (((↑↑↑)))
; ***DATA***
CRLF: BYTE (7)15,12,0,0,0
SEMI: BYTE (7)";",15,12,0,0
HOSTS: 5,,[ASCIZ/BBN/] ; TENEXE
11,,[ASCIZ/HARVARD/]
13,,[ASCIZ/SUAI/]
37,,[ASCIZ/CCA/]
53,,[ASCIZ/OFFICE"-1/]
55,,[ASCIZ/SCI/]
56,,[ASCIZ/RUTGERS/]
61,,[ASCIZ/BBN/] ; TENEXB
70,,[ASCIZ/SUMEX/]
102,,[ASCIZ/AIC/]
106,,[ASCIZ/ITS/] ; DMS
126,,[ASCIZ/ISI/] ; ISI
162,,[ASCIZ/BBN/] ; TENEXD
206,,[ASCIZ/ITS/] ; AI
226,,[ASCIZ/ISI/] ; ISIC
305,,[ASCIZ/BBN/] ; TENEXA
306,,[ASCIZ/ITS/] ; ML
326,,[ASCIZ/ISI/] ; ISID
354,,[ASCIZ/ITS/] ; MC
361,,[ASCIZ/BBN/] ; TENEXC
364,,[ASCIZ/ISI/] ; ISIB
0
LIT ; LITERALS GO HERE
; (((ITS)))
IFL F.TENX,<
IOBUFR: BLOCK 2000
LCLDEV: BLOCK 1 ; local device
LCLFN1: BLOCK 1
LCLFN2: BLOCK 1
LCLSNM: BLOCK 1 ; SNAME
RCHBLK: BLOCK 10 ; network status goes here
LCLRCV: BLOCK 1
LCLTRN: BLOCK 1
FORRCV: BLOCK 1
FORTRN: BLOCK 1
FFITYP: BLOCK 1
LCLDAT: BLOCK 1
DIRBLK: BLOCK 2000
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
RELOC 0
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBLK: SIXBIT /IMP/
0
100 ; LOCAL SOCKET
40,,DCHOST ; 32 BIT BYTES (ICP), CCA HOST
DCSOKT ; DATACOMPUTER SOCKET
DCIBLK: SIXBIT /IMP/
0
102 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP + 1
DCOBLK: SIXBIT /IMP/
0
103 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP
DCDBLK: SIXBIT /IMP/
0
0 ; LOCAL SOCKET (104 RECEIVE, 105 SEND)
44,,DCHOST ; 36 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP +2 OR +3
WRKBLK: BLOCK 5
ICCHAS: 10 ; IMAGE MODE
SIXBIT /IMP/
0,,ICPBUF
ICPBUF: BLOCK 3
DCCHAS: 0 ; 7 BIT ASCII MODE
SIXBIT /IMP/
DCOBUF,,DCIBUF
>
; (((↑↑↑)))
DCIBUF: BLOCK 3
DCOBUF: BLOCK 3
DDCHAS: 13 ; BINARY
SIXBIT /IMP/
DDOBUF,,DDIBUF
DDIBUF: BLOCK 3
DDOBUF: BLOCK 3
LFILE: 0 ; LOCAL FILE NAME
0 ; EXTENSION
0 ; PROTECTION AND CREATION DATE
0 ; PROJ-PROG - 0 IS SELF
LFCHAS: 13 ; BINARY MODE
SIXBIT /DSK/
LFOBUF,,LFIBUF
LFIBUF: BLOCK 3
LFOBUF: BLOCK 3
LDIR: 0 ; PROJ-PROG OF USER
0 ; "UFD"
0
0 ; [1,1]
LDCHAS: 13
SIXBIT /DSK/
0,,LDIBUF
LDIBUF: BLOCK 3
LUTDSP: 0
LUTDSF: BLOCK SBSIZE
; (((SAIL)))
IFN F.SAIL,<
CONECB: BLOCK 7
; OTHER RANDOM THINGS
TERBLK: 3 ; TERMINATE BLOCK
0 ; STATUS BITS
1 ; FOREIGN SOCKET LOC
0 ; DON'T WAIT
STTBLK: 2
BLOCK 2
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
LEVTAB: PSIPC1
PSIPC2
PSIPC3
PSIPC1: BLOCK 1
PSIPC2: BLOCK 1
PSIPC3: BLOCK 1
CHNTAB: 1,,TCOPSI
REPEAT 9,<EXP 0>
1,,EOFPSI
REPEAT 4,<EXP 0>
1,,ILIPSI
REPEAT ↑D20,<EXP 0>
FLAGCO: 0
FLAGEF: 0
DCSOCK: DCSOKT
ICPSOC: 0 ; ICP SOCKET
DCIJFN: 0 ; DC INPUT JFN
DCOJFN: 0 ; DC OUTPUT JFN
DCDJFN: 0 ; DC DATA JFN
LFILE: BLOCK SBSIZE
LJFN: 0
LDIR: 0
VSBUF: 0
PAGE: BLOCK SIZPAG
>
; (((↑↑↑)))
; * VARIABLES
CMDMOD: 0
LHOST: 0
ANCHOR: ASCIZ /DFTP/
BLOCK <SBSIZE-2>
CONTEX: BLOCK LBSIZE
OPENED: BLOCK LBSIZE
OPENEM: 0
FLAGDD: 0
FLAGDE: 0
FLAGTT: -1
; * BLOCKS
NBUF: BLOCK LBSIZE
FBUF: BLOCK SBSIZE
EBUF: BLOCK SBSIZE
VBUF: 0
FSBUF: BLOCK SBSIZE
ESBUF: BLOCK SBSIZE
ABUF: BLOCK SBSIZE
UBUF1: BLOCK LBSIZE
UBUF2: BLOCK SBSIZE
GBUF1: BLOCK LBSIZE
GBUF2: BLOCK LBSIZE
NTIME: 0
NSIZE: 0
NSUM: 0
TCIPCL: BLOCK 100 ; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP: 0 ; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
BLOCK 37 ; (SIZE = # CHARS IN LARGEST CMD)
TCIPNF: 0 ; P(OSSIBLE)N(EXT)F(REE)
STSIZ==100
STBEG: BLOCK STSIZ
-1 ; CRETINOUS LINK-10 BUG
END DFTP
ββ